问题描述
我对Scipy.minimize感到疯狂。
我只是试图将某个列表与代表贝塞尔曲线的一组参数拟合。
我的输入是“ curveToFitArray”。我有一个初步的猜测“ x0”,我将其切成两半,以在“ Y”和“ Z”中获得贝塞尔曲线点坐标。我想找到这样的参数,以最小化通过贝塞尔曲线参数化生成的曲线和实际曲线之间的误差:
from scipy.optimize import minimize
from scipy.interpolate import interp1d
import numpy as np
from scipy.special import comb
def bernstein_poly(i,n,t):
return comb(n,i) * ( t**(n-i) ) * (1 - t)**i
def bezier_curve(points,nTimes=50):
nPoints = len(points)
xPoints = np.array([p[0] for p in points])
yPoints = np.array([p[1] for p in points])
t = 0.5 * (1 - np.cos(np.linspace(0,np.pi,nTimes)))
polynomial_array = np.array([bernstein_poly(i,nPoints-1,t) for i in range(0,nPoints)])
xvals = np.dot(xPoints,polynomial_array)
yvals = np.dot(yPoints,polynomial_array)
return [list(c) for c in zip(xvals,yvals)]
def bspline(p,scale=[1.0,1.0],U='Y',V='X',nPoints=50):
point_list = [[u*scale[0],v*scale[1]] for u,v in zip(p[U],p[V])]
BSpline = bezier_curve(point_list,nPoints)
#pts_BSpline = np.array(BSpline).T
return sorted(BSpline,key=lambda x: x[0])
def Distance(curve):
distance = np.cumsum(np.sqrt(np.sum(np.diff(curve,axis=0)**2,axis=1)))
distance = np.insert(distance,0)/distance[-1]
return distance
def divide(curve,n):
distance = Distance(curve)
alpha = np.linspace(0,1,n)
interpolation = interp1d(distance,curve,kind='linear',axis=0)
interp_sort = sorted([[s,*c] for s,c in zip(alpha,interpolation(alpha))],key=lambda x: x[0])
return [c[1:] for c in interp_sort]
def parseParameters(x):
d = {}
d["Y"] = list(x[0:4])
d["Z"] = list(x[4:])
return d
def objective(x,curveToFit):
parameters = parseParameters(x)
curveEval = divide(bspline(p = parameters,V='Z',nPoints=len(curveToFit)),len(curveToFit))
curveEval = np.array(curveEval)
curveToFit = np.array(curveToFit)
error = np.sqrt((np.subtract(curveEval,curveToFit)** 2))
error = np.sum(error)
return error
curveToFit = [[0.0,0.0],[0.08462454350227121,-0.0006072162233802024],[0.16920310091996732,-0.0034025456809973417],[0.2533683125896774,-0.012003143737867554],[0.337444,-0.021644]]
x0 = [0.0,0.050616600000000005,0.253083,0.337444,0.0,-0.021644,-0.021644]
bounds = [[0.0,[-0.015,0.35244400000000004],0.337444],[0.0,[-0.036643999999999996,0.015],[-0.021644,-0.021644]]
result = minimize(
fun = objective,x0 = x0,bounds = bounds,method='L-BFGS-B',args=(curveToFit),options={'disp':True}
)
几个月前,我的计算机运行良好。然后可能对我的代码做了一些修改,而没有检查配件是否仍在工作。现在我不记得我做了什么更改以使其停止工作...
算法只是不进行迭代,每次都返回非常接近x0的结果
非常感谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)