fmin_slsqp返回初始猜测找到最小三次样条的

问题描述 投票:2回答:1

我试图找到最小的自然三次样条的。我写了下面的代码,以查找自然三次样条。 (我一直在给定的测试数据,并确认该方法是正确的。)现在我无法弄清楚如何找到最小的这种功能。

这是该数据

xdata = np.linspace(0.25, 2, 8)
ydata = 10**(-12) * np.array([1,2,1,2,3,1,1,2])

这是函数

import scipy as sp
import numpy as np
import math
from numpy.linalg import inv
from scipy.optimize import fmin_slsqp
from scipy.optimize import minimize, rosen, rosen_der

def phi(x, xd,yd):
    n = len(xd)
    h = np.array(xd[1:n] - xd[0:n-1])
    f = np.divide(yd[1:n] - yd[0:(n-1)],h)

    q = [0]*(n-2)

    for i in range(n-2):
        q[i] = 3*(f[i+1] - f[i])

    A = np.zeros(((n-2),(n-2)))

    #define A for j=0
    A[0,0] = 2*(h[0] + h[1])
    A[0,1] = h[1]

    #define A for j = n-2
    A[-1,-2] = h[-2]
    A[-1,-1] = 2*(h[-2] + h[-1])

    #define A for in the middle
    for j in range(1,(n-3)):
        A[j,j-1] = h[j]
        A[j,j] = 2*(h[j] + h[j+1])
        A[j,j+1] = h[j+1]

    Ainv = inv(A)

    B = Ainv.dot(q)

    b = (n)*[0]
    b[1:(n-1)] = B

    # now we find a, b, c and d

    a = [0]*(n-1)
    c = [0]*(n-1)
    d = [0]*(n-1)

    s = [0]*(n-1)

    for r in range(n-1):
        a[r] = 1/(3*h[r]) * (b[r + 1] - b[r])
        c[r] = f[r] - h[r]*((2*b[r] + b[r+1])/3)
        d[r] = yd[r]

    #solution 1 start
    for m in range(n-1):
        if xd[m] <= x <= xd[m+1]:
            s = a[m]*(x - xd[m])**3 + b[m]*(x-xd[m])**2 + c[m]*(x-xd[m]) + d[m]

    return(s)
    #solution 1 end

我想找到我的外部数据的域最低,所以FMIN没有工作,你不能定义边界在那里。我想这两个fmin_slsqp和减少。他们不是与phi功能我写的,所以我重写了phi(x, xd,yd)并添加一个额外的变量,使得Phi是phi(x, xd,yd, m)兼容。 M表示在我们所计算溶液中的花键的子功能(从x_m到x_m + 1)。在代码中我们替换#solution 1由以下

# solution 2 start

return(a[m]*(x - xd[m])**3 + b[m]*(x-xd[m])**2 + c[m]*(x-xd[m]) + d[m])
# solution 2 end

为了找到最小域中x_m到X_(M + 1),我们使用下面的代码:(我们使用的实例,其中m = 0,所以从x 0.25〜0.5的初始猜测是0.3)

fmin_slsqp(phi, x0 = 0.3, bounds=([(0.25,0.5)]), args=(xdata, ydata, 0))

那么,什么我会做(我知道这是原油),是迭代这跟一个for循环来找到所有子域的最低,然后采取整体最小。然而,功能fmin_slsqp不断返回初始猜测为最小。所以,有什么不对,我不知道如何解决。如果你能帮助我,这将不胜感激。感谢远阅读本。

python scipy spline cubic-spline fminsearch
1个回答
3
投票

当我绘制你的函数phi和你Feed中的数据,我看到它的范围是1E-12的顺序。然而,fmin_slsqp无法处理的精度该水平,未能找到你的目标的任何变化。

我提出的解决方案正在扩大你的目标的精度,像这样的顺序相同的回报:return(s*1e12)

然后你会得到很好的效果。

>>> sol = fmin_slsqp(phi, x0=0.3, bounds=([(0.25, 0.5)]), args=(xdata, ydata))
>>> print(sol)
Optimization terminated successfully.    (Exit mode 0)
        Current function value: 1.0
        Iterations: 2
        Function evaluations: 6
        Gradient evaluations: 2
[ 0.25]

Plot of Phi

© www.soinside.com 2019 - 2024. All rights reserved.