在物理学中,有一种不太常被提及但非常有趣的观点:将物理问题看作优化问题。本文将通过一个简单的例子,向大家介绍如何用梯度下降来寻找物理系统中的"最小作用路径"。这种方法不仅直观易懂,还为我们理解复杂物理现象提供了新的视角。
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())总结与思考