闽公网安备 35020302035485号
在物理学中,有一种不太常被提及但非常有趣的观点:将物理问题看作优化问题。本文将通过一个简单的例子,向大家介绍如何用梯度下降来寻找物理系统中的"最小作用路径"。这种方法不仅直观易懂,还为我们理解复杂物理现象提供了新的视角。

deffalling_object_analytical(x0, x1, dt, g=1, steps=100):
v0 = (x1 - x0) / dt
t = np.linspace(0, steps, steps+1) * dt
x = -.5*g*t**2 + v0*t + x0 # the equation of motion
return t, x
x0, x1 = [0, 2]
dt = 0.19
t_ana, x_ana = falling_object_analytical(x0, x1, dt)
运行结果如下图所示:
deffalling_object_numerical(x0, x1, dt, g=1, steps=100):
xs = [x0, x1]
ts = [0, dt]
v = (x1 - x0) / dt
x = xs[-1]
for i inrange(steps-1):
v += -g*dt
x += v*dt
xs.append(x)
ts.append(ts[-1]+dt)
return np.asarray(ts), np.asarray(xs)
t_num, x_num = falling_object_numerical(x0, x1, dt)
运行结果如下图所示:


import torch
deflagrangian_freebody(x, xdot, m=1, g=1):
T = .5 * m * xdot**2
V = m * g * x
return T - V
defaction(x, dt):
xdot = (x[1:] - x[:-1]) / dt
xdot = torch.cat([xdot, xdot[-1:]], axis=0)
L = lagrangian_freebody(x, xdot)
return torch.sum(L) * dt
# 初始化位置坐标
x = torch.tensor([0.0] * 101, requires_grad=True)
dt = 0.19
# 堆代码网 duidaima.com
# 梯度下降优化
optimizer = torch.optim.Adam([x], lr=0.1)
for step inrange(1000):
optimizer.zero_grad()
S = action(x, dt)
S.backward()
optimizer.step()
print("Optimized positions:", x.detach().numpy())
总结与思考