对于以下代码:
from numpy import *
from scipy.optimize import minimize
from math import *
N = 40
m = 4/N
D = (70/40)*N
g = 9.81
y1, z1 = -2, 1
yn, zn = 2, 1
y_l = linspace(y1, yn, num=N)
z_l = linspace(z1, zn, num=N)
x = stack((y_l, z_l))
def V_g(x):
z_sum = 0
for i in x[1]:
z_sum += i
return z_sum
def V_spring(x):
sum_list = []
y = x[0]
z = x[1]
for i in range(1,N-1):
sum_list.append((y[i] - y[i+1])**2 + (z[i] - z[i+1])**2)
vs = sum(sum_list)
return vs
def V(x):
return (0.5*D*V_spring(x)) + (m*g*V_g(x))
res = minimize(V, x)
print(res)
我收到以下错误:
IndexError: invalid index to scalar variable
对于
行 sum_list.append((y[i] - y[i+1])**2 + (z[i] - z[i+1])**2)
有人可以帮帮我吗?
任务是尽量减少链条的潜在能量:
请注意,在势能方程中,等式的第一部分有一个拼写错误,应该是:
总和(从i = 1到N-1)[D *(y_i - y_i + 1)^ 2 ...]
从上面的代码中,我首先创建了'y'和'z'的两个'初始猜测'列表(分别是水平和垂直坐标),然后创建了一个堆叠数组。使用V_g(这是势能方程的第二部分)和V_spring(这是第一部分),计算求和并最终使用V,计算总势能,然后将其馈送到'res',试图最小化这个值/函数返回一个'new'数组,其中包含链中每个质量的更新坐标。