使用scipy.optimize.minimize时

时间:2016-09-29 08:27:52

标签: python numerical-methods

对于以下代码:

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)

有人可以帮帮我吗?

任务是尽量减少链条的潜在能量:

This equation

For this boundary condition

请注意,在势能方程中,等式的第一部分有一个拼写错误,应该是:

总和(从i = 1到N-1)[D *(y_i - y_i + 1)^ 2 ...]

从上面的代码中,我首先创建了'y'和'z'的两个'初始猜测'列表(分别是水平和垂直坐标),然后创建了一个堆叠数组。使用V_g(这是势能方程的第二部分)和V_spring(这是第一部分),计算求和并最终使用V,计算总势能,然后将其馈送到'res',试图最小化这个值/函数返回一个'new'数组,其中包含链中每个质量的更新坐标。

0 个答案:

没有答案