 闽公网安备 35020302035485号
                
                闽公网安备 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())
总结与思考