- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试找到尽可能适合绿色曲线上的蓝色模型的x0
参数(x0
控制垛口的宽度;见下文) .
这是我的尝试:
from pylab import *
from scipy.optimize import curve_fit
x=linspace(0,2*pi,1000)
def crenel(x):return sign(sin(x))
def inverter(x,x0): return (crenel(x-x0)+crenel(x+x0))/2
p,e = curve_fit(inverter,x,sin(x),1)
plot(x,inverter(x,*p),x,sin(x))
ylim(-1.5,1.5)
手动计算时,最佳值为 x0 = arcsin(1/2) # 0.523598
,但 curve_fit 未估计任何值(“OptimizeWarning:Covariance of the parameters could not be估计")。我怀疑模型的刚度。 docs告知:
The algorithm uses the Levenberg-Marquardt algorithm through leastsq. Additional keyword arguments are passed directly to that algorithm.
所以我的问题是:在这种情况下,是否有关键字参数可以帮助 curve_fit
估计参数?还是另一种方法?
感谢您的任何建议。
最佳答案
问题是 curve_fit
试图最小化的目标函数不是连续的。 x0
控制 inverter
函数中不连续点的位置。当不连续点穿过 x
中的一个网格点时,目标函数就会发生跳跃。在这些点之间,目标函数是常数。 curve_fit
(其实就是leastsq
,curve_fit
使用的函数)并不是为了处理这样的函数而设计的。
以下函数 sse
是(实际上)curve_fit
试图最小化的函数,x
与 x 相同
在您的示例中定义,并且 y = sin(x)
:
def sse(x0, x, y):
f = inverter(x, x0)
diff = y - f
s = (diff**2).sum()
return s
如果您使用如下代码将此函数绘制在精细网格上
xx = np.linspace(0, 1, 10000)
yy = [sse(x0, x, y) for x0 in xx]
plot(xx, yy)
然后放大,你会看到
要使用 scipy
找到最佳值,您可以使用具有平滑目标函数的 fmin
。例如,这里是连续目标函数,仅使用区间 [0, pi/2](quad
是 scipy.integrate.quad
):
def func(x0):
s0, e0 = quad(lambda x: np.sin(x)**2, 0, x0)
s1, e0 = quad(lambda x: (1 - np.sin(x))**2, x0, 0.5*np.pi)
return s0 + s1
scipy.optimize.fmin
可用于查找该函数的最小值,如 ipython session 中的此片段所示:
In [202]: fmin(func, 0.3, xtol=1e-8)
Optimization terminated successfully.
Current function value: 0.100545
Iterations: 28
Function evaluations: 56
Out[202]: array([ 0.52359878])
In [203]: np.arcsin(0.5)
Out[203]: 0.52359877559829882
关于python curve_fit不适用于刚性模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35158266/
这是 opencv: Rigid Transformation between two 3D point clouds 的重复问题.但是,没有接受任何答案,我不明白那里唯一的答案。 唯一的答案是缩放和
我需要一个 ODE 求解器来解决类似于 MATLAB ode15s 的刚性问题。 对于我的问题,我需要检查不同初始值需要多少步(计算)并将其与我自己的 ODE 求解器进行比较。 我试过用 solver
我是一名优秀的程序员,十分优秀!