【问题标题】:solving non-linear equations using scipy使用 scipy 求解非线性方程
【发布时间】:2021-12-06 14:48:37
【问题描述】:

我正在尝试解决以下等式:

如果给出了 A_e/A* 值的列表,并且 gamma=1.2,我应该如何求解这个方程,以便返回对应于 A_e/A* 值列表的 M_e 列表? 我考虑过使用scipy.optimize.newton,但这似乎不是正确的方法

def expr(x):
       
    result = np.arange(1,1.25,step=0.004)-((1/x)*((2/(1.2+1))*(1+((1.2-1)/2)*x**2))**((1.2+1)/(2*1.2-1)))
            
    return result.any()


scipy.optimize.newton(expr,1.1)


---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_4660/3619719442.py in <module>
----> 1 scipy.optimize.newton(expr,1.1,x1=1.2)

D:\Softwares\Anaconda\lib\site-packages\scipy\optimize\zeros.py in newton(func, x0, fprime, args, tol, maxiter, fprime2, x1, rtol, full_output, disp)
    338                             " Failed to converge after %d iterations, value is %s."
    339                             % (itr + 1, p1))
--> 340                         raise RuntimeError(msg)
    341                     warnings.warn(msg, RuntimeWarning)
    342                 p = (p1 + p0) / 2.0

RuntimeError: Tolerance of 0.09999999999999987 reached. Failed to converge after 1 iterations, value is 1.2.

我用x表示M_e,我用值列表替换了Ae/A*--np.arange(1,1.25,step=0.004) 但是,我猜牛顿的方法只能返回1个标量值,但是我用a定义了函数Ae/A* 值的全面列表。我应该如何解决这个问题?

【问题讨论】:

    标签: scipy


    【解决方案1】:

    newton 适用于标量函数,您将其转换为向量函数。由于您希望不同的Ae 值为零,因此在函数定义中包含Ae 参数,然后多次调用newton(您可以使用args 关键字):

    def expr(x, a):
        result = a-((1/x)*((2/(1.2+1))*(1+((1.2-1)/2)*x**2))**((1.2+1)/(2*1.2-1)))
        return result
    
    [newton(expr, .01, args=(a,)) for a in np.arange(1,1.25,step=0.004)]
    
    >>[0.9999999999999992, 0.9944379739232752,0.9889506795317498, 0.9835363421148852, ...
    

    【讨论】:

    • 我有一个后续问题。如何强制结果> 1?这个方程理论上应该返回一个小于 1 的值和一个大于 1 的值
    • newton你需要指定x0(0.01在答案中,你可以改变它)。选择 x>1 解决方案的唯一方法是设置 x0 以使解决方案在那里收敛。您可以通过选择相当大的 x0(通常有效)或选择 x0 以使 xs
    • 您也可以使用 bisect 方法(scipy.optimize.brentq 与 bisect 类似,但速度更快)
    • 其实我觉得每次迭代都需要改变收敛猜测x0,所以我修改了代码如下:mach_exit_list=[scipy.optimize.newton(expr, tol=1.48e-6,maxiter=1000,args=(a,x)) for a in np.arange(2,50.5,step=0.5) &amp; for x in np.arange(2,6.01,step=0.01)],但是,这行不通。我应该如何将xa 合并到args 中?
    • 试试[scipy.optimize.newton(expr, x0, tol=1.48e-6, maxiter=1000, args=(a,)) for a, x0 in zip(np.arange(2,50.5,step=0.5), np.arange(2,6.01,step=0.01) )]
    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 2015-09-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多