Scipy最小化无法迭代

问题描述

我对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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...