首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于曲线拟合的scipy solve_ivp的灵活初始状态

用于曲线拟合的scipy solve_ivp的灵活初始状态
EN

Stack Overflow用户
提问于 2020-09-10 13:06:09
回答 1查看 90关注 0票数 0

我正在试着用一个微分方程来拟合少量的测量值。我在solve_ivp中遇到了需要初始状态的问题,我不得不将其定义为静态值。这个问题可以在下面的图片中看到。每次拟合被强制通过第一个测量点时,一些调整将提供更好的拟合。

有没有办法让初始状态y0curve_fit使用的fitfunc中变得灵活

我可以求解微分方程,只使用curve_fit,但我更喜欢将它保留在我的代码中。以防将来我有更复杂的微分方程,这些微分方程不能用一般的方法解决。

代码语言:javascript
复制
import scipy.optimize as scopt
import scipy.integrate as scint

def Tdot(t, T, h, X):
    Tdot = -(T - T_inf)*((h*A)/(rho*c*V))
    return Tdot

def do_fit(D, d):
    x_data = D.loc[:, 't'].values
    y_data = D.loc[:, 'T'].values
       
    def fitfunc(t, h):
        y0 = y_data[0]
        
        # Solve differential equation
        sol = scint.solve_ivp(Tdot, [0, np.max(x_data)], [y0], 
                              args = (h, 0),
                              t_eval = x_data, max_step=1e-3)
        
        return sol.y.flatten()
    
    # Fit equation to measurements
    h_fit, kcov = scopt.curve_fit(fitfunc, x_data, y_data, p0=200)
    
    # Limits and values for plotted fit
    tfit = np.linspace(0, D.t.round(1).max())
    fit = scint.solve_ivp(Tdot, [0, np.max(tfit)], [y_data[0]], max_step=1e-3, args=(h_fit, 0))

    return fit, h_fit
EN

回答 1

Stack Overflow用户

发布于 2020-09-10 17:28:10

想出了解决方案。将初始值添加到我的拟合函数中,并修改数据计算以进行匹配。

def fitfunc(t, h)def fitfunc(t, h, y0)

h_fit, kcov = scopt.curve_fit(fitfunc, x_data, y_data, p0=200) to

popt, _ = scopt.curve_fit(fitfunc, x_data, y_data)

fit = scint.solve_ivp(Tdot, [0, np.max(tfit)], [y_data[0]], max_step=1e-3, args=(h_fit, 0)) to

fit = scint.solve_ivp(Tdot, [0, np.max(tfit)], [popt[1]], max_step=1e-3, args=(popt[0], 0))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63823135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档