我在寻找两点之间的最短路径,(0,0)和(1000,-100)。路径由7阶多项式函数定义:
p(x)=a0+a1*x+a2*x^2+。。。+a7*x^7号
为此,我尝试最小化从多项式函数计算总路径长度的函数:
length=int,从0到1000{sqrt(1+(dp(x)/dx)^2)}
显然,正确的解决方案是一条直线,但是稍后我想给这个问题添加约束。这一次应该是第一次。在
我实现的代码是:import numpy as np
import matplotlib.pyplot as plt
import math
import sys
import scipy
def path_tracer(a,x):
return a[0] + a[1]*x + a[2]*x**2 + a[3]*x**3 + a[4]*x**4 + a[5]*x**5 + a[6]*x**6 + a[7]*x**7
def lof(a):
upper_lim = a[8]
L = lambda x: np.sqrt(1 + (a[1] + 2*a[2]*x + 3*a[3]*x**2 + 4*a[4]*x**3 + 5*a[5]*x**4 + 6*a[6]*x**5 + 7*a[7]*x**6)**2)
length_of_path = scipy.integrate.quad(L,0,upper_lim)
return length_of_path[0]
a = np.array([-4E-11, -.4146,.0003,-7e-8,0,0,0,0,1000]) # [polynomial parameters, x end point]
xx = np.linspace(0,1200,1200)
y = [path_tracer(a,x) for x in xx]
cons = ({'type': 'eq', 'fun': lambda x:path_tracer(a,a[8])+50})
c = scipy.optimize.minimize(lof, a, constraints = cons)
print(c)
但是,当我运行它时,最小化例程失败并返回初始参数不变。输出为:
^{pr2}$
是我做错了什么事,还是例行公事不适合解决这类问题?如果是这样的话,Python中是否有其他选择?在