【问题标题】:Fitting with Transcendental equation用超越方程拟合
【发布时间】:2017-02-23 16:56:10
【问题描述】:

我有一组正常的数据,电流密度是电压 J(V) 的函数。我的目标是用模型拟合这些数据。问题是我的模型是由超越方程组成的,所以我不能用 J 来编写函数,例如使用lmfit。我的模型如下所示:

请看图

有什么想法可以做到吗?

如果我用fsolve 或类似的解决系统,我必须提供参数,所以我不知道该怎么办。

我也试过用Scypy解决这个系统,但是没用..

【问题讨论】:

    标签: python curve-fitting lmfit


    【解决方案1】:

    我不确定您是否会找到一种干净、简单的方法来执行此操作——如果您这样做了,请告诉我们。

    由于您的函数基本上是指数函数,您可能会发现在模型函数中进行几次迭代会产生稳定、自洽的结果。也就是说,如果值“表现良好”,使得电压降扰动 (Vdn - V) 相当小,那么采用几个循环来达到接近自洽可能就足够了。

    再一次,由于它们是指数的,对于较大的 V 正值,它们可能会迅速发散。

    【讨论】:

    • 嗯,不知道为什么我建议的迭代方法尝试为不同的术语 Ji 和 Vi 获得一组自洽的值被否决了。我希望它可以工作,至少对于某些参数值。是否证明在这种情况下不起作用?你找到更好的方法了吗?
    • 我没有投错票。我仍然没有尝试你的建议。但是我在Numerical Methods for Nonlinear Engineering Model - John R. Hauser 一书中发现了类似的问题。问题是这本书使用了 lua 编程语言。所以我仍然在处理那个例行公事。如果我成功了,我会在这里发布。
    • 您似乎也没有接受答案或投票。
    • 对不起!我在这里很新。我总是忘记这样做。我仍然无法解决它:/
    【解决方案2】:

    我认为scipy.optimize.curve_fit 有您想要的,我发现this tutorial 对我的情况很有帮助。

    你也许可以这样做:

    from scipy.optimize import curve_fit
    
    def CurrentDensityFromVoltage(V, RS1, RS12, r, J01, J02):
         VD1 = <expression> 
         VD2 = <expression> 
         J1 = <expression>
         J2 = <expression>
         J3 = <expression>
         return J1+J2+J3
    
    # coefficients to get CurrentDensity as a function of Voltage
    param, _ = curve_fit(CurrentDensityFromVoltage, Voltage, CurrentDensity)
    
    # current density 'cd' for any voltage 'v'
    cd = CurrentDensityFromVoltage(v, param[0], param[1], param[2], param[3], param[4])
    

    【讨论】:

    • 问题是询问一个超越函数,其中J1J2 的表达式分别依赖于J1J2,并且会在拟合过程中发生变化。 curve_fitlmfit(或任何其他数值最小化方法)都不会明确处理这个问题,并且必须依靠迭代来获得可接受的自洽结果。可能需要在模型函数的每次评估中进行几次这样的迭代,并可能检查这些迭代的收敛性。
    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2013-03-15
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多