【问题标题】:Fitting Differential Equations: curve_fit converges to local minima拟合微分方程:curve_fit 收敛到局部最小值
【发布时间】:2012-02-06 21:52:01
【问题描述】:

我正在尝试通过改变 a 和 b 来将微分方程 ay' + by''=0 拟合到曲线以下代码不起作用。 curve_fit 的问题似乎是缺乏初始猜测导致拟合失败。我也试过了。谁能建议我用其他方法来拟合这种微分方程?如果我没有很好的猜测,curve_fit 会失败!

from scipy.integrate import odeint
from scipy.optimize import curve_fit
from numpy import linspace, random, array

time = linspace(0.0,10.0,100)
def deriv(time,a,b): 
    dy=lambda y,t : array([ y[1], a*y[0]+b*y[1] ])
    yinit = array([0.0005,0.2]) # initial values
    Y=odeint(dy,yinit,time)
    return Y[:,0]

z = deriv(time, 2, 0.1)
zn = z + 0.1*random.normal(size=len(time))

popt, pcov = curve_fit(deriv, time, zn)
print popt  # it only outputs the initial values of a, b!

【问题讨论】:

  • 在我们开始回答这个问题之前,请接受您对之前问题的回答(答案左侧的绿色勾号)。
  • @ovgolovin 谢谢你的建议。我所拥有的是一组随着时间推移的数字。我试图找出这个微分方程的解是否可以用来拟合数据。
  • 有什么原因不能只使用微分方程的闭式解吗?
  • “它不起作用”是什么意思?上面的代码正确打印了[ 1.99997875 0.10001344],这确实是数据zn中拟合的参数?

标签: python numpy matplotlib scipy


【解决方案1】:

让我们重写方程:

ay' + by''=0
y'' = -a/b*y'

所以这个方程可以这样表示

dy/dt = y'
d(y')/dt = -a/b*y'

Python 2.7 中的代码:

from scipy.integrate import odeint
from pylab import *

a = -2
b = -0.1

def deriv(Y,t):
    '''Get the derivatives of Y at the time moment t
Y = [y, y' ]'''
    return array([ Y[1], -a/b*Y[1] ])

time = linspace(0.0,1.0,1000)
yinit = array([0.0005,0.2]) # initial values
y = odeint(deriv,yinit,time)
figure()
plot(time,y[:,0])
xlabel('t')
ylabel('y')
show()

您可以将结果图与WolframAlpha 中的图进行比较

【讨论】:

  • @pappu 您能否将此评论添加到问题中?因为从问题中并不清楚。我得到的是“我能做的是用 odeint 求解方程并绘制它的情节。?”。
  • @pappu 另外,您尝试拟合的曲线是如何设置的?在问题中也提供此信息。
  • @pappu 你要问的是曲线拟合。这些任务是通过机器学习方法解决的,它们并非微不足道。例如,接近目标曲线的标准是什么?随着标准的变化,结果曲线也会发生变化
  • @pappu 第一个想法是实现h 计算两条曲线之间的接近度的函数。通过改变ab,您将通过求解微分方程得到不同的曲线,从而使h 函数返回不同的值。然后使用不同的优化算法(例如梯度下降等),您可以找到ab,它们最小化了h 的输出。就您制定的函数h 而言,那些ab 将给出最接近目标曲线的曲线。
【解决方案2】:

如果您的问题是默认初始猜测,请阅读文档curve_fit 以了解如何通过为其提供p0 参数来手动指定它们。例如,curve_fit(deriv, time, zn, p0=(12, 0.23)) 如果您希望 a=12b=0.23 成为初始猜测。

【讨论】:

  • 我已经检查过了。如果我没有很好的猜测,curve_fit 会失败!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2018-09-03
  • 1970-01-01
  • 2011-04-09
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多