如何使用Newton-Raphson方法在Python中计算多变量方程组?

问题描述

我需要您的编程帮助。这是我的方程组:

ILLEgal

f_1(x1,x2) = 89.3885624 + 169.6377442*x1 + 169.439564*x2 
+ 65.07923*((3*x1*(-a1-sqrt(a1^2 - 4*a0*a2)/(2*a2) +0.55071844)/3*x2) 
+ 162.698313*((-a1-sqrt(a1^2 - 4*a0*a2))/2*a2) 
+ 174.39264*x1*((3*x1*(-a1-sqrt(a1^2 - 4*a0*a2))/(2*a2) +0.55071844)/3*x2) 
+ 174.39264*x2*((-a1-sqrt(a1^2 - 4*a0*a2))/2*a2) 
+ 72.077218*x1*((-a1-sqrt(a1^2 - 4*a0*a2))/2*a2) 
+ 189.511738*x2*((3*x1*(-a1-sqrt(a1^2 - 4*a0*a2)/(2*a2) +0.55071844)/3*x2)

f_2(x1,x2) = 78.183644 + 26.71298*x1 + 66.782413*x2 - 169.637744*((3*x1*(-a1-sqrt(a1^2 - 4*a0*a2)/(2*a2) +0.55071844)/3*x2) - 169.439564*((-a1-sqrt(a1^2 - 4*a0*a2))/2*a2) - 174.39264*((3*x1*(-a1-sqrt(a1^2 - 4*a0*a2)/(2*a2) +0.55071844)/3*x2)^2 - 261.5889567*((3*x1*(-a1-sqrt(a1^2 - 4*a0*a2)/(2*a2) +0.55071844)/3*x2) *((-a1-sqrt(a1^2 - 4*a0*a2))/2*a2) - 174.39264*((-a1-sqrt(a1^2 - 4*a0*a2))/2*a2)^2 - 54.306279*x1*((-a1-sqrt(a1^2 - 4*a0*a2))/2*a2) + 54.306279*x2*((3*x1*(-a1-sqrt(a1^2 - 4*a0*a2)/(2*a2) +0.55071844)/3*x2) a0a1是具有变量a2x1的方程。

这两个方程必须等于0或非常接近x2。我想使用牛顿-拉夫森法,但我不知道如何。在互联网上,我找到了很多示例,但它们像我一样使用了更简单的方程组。

对不起,我的英语不好,谢谢您的帮助!

解决方法

您可以使用scipympmath,请查看此答案Find roots of a system of equations to an arbitrary decimal precision

如果您想自己解决问题,请查看以下链接:http://fourier.eng.hmc.edu/e176/lectures/NM/node21.html

您需要计算函数的偏导数,才能计算雅可比矩阵,然后将其求逆。您的函数非常粗糙,因此您可以考虑使用wolframscript,它是Mathematica的命令行版本。这样可以更轻松地计算导数。

例如,使用wolframscript(进行了类似sqrt()-> Sqrt []的细微更改,并在行的末尾加上+来执行多行函数),您可以轻松地获得所需的偏导数。

In[8]:= f1[x1_,x2_] := 89.3885624 + 169.6377442*x1 + 169.439564*x2 +
65.07923*((3*x1*(-a1-Sqrt[a1^2 - 4*a0*a2])/(2*a2) +0.55071844)/3*x2) +
162.698313*((-a1-Sqrt[a1^2 - 4*a0*a2])/2*a2) +
174.39264*x1*((3*x1*(-a1-Sqrt[a1^2 - 4*a0*a2])/(2*a2) +0.55071844)/3*x2) +
174.39264*x2*((-a1-Sqrt[a1^2 - 4*a0*a2])/2*a2) +
72.077218*x1*((-a1-Sqrt[a1^2 - 4*a0*a2])/2*a2) +
189.511738*x2*((3*x1*(-a1-Sqrt[a1^2 - 4*a0*a2])/(2*a2) +0.55071844)/3*x2)

In[9]:= D[f1[x1,x2],x1]                                                                          
                                           2
Out[9]= 169.638 + 36.0386 a2 (-a1 - Sqrt[a1  - 4 a0 a2]) +

                           2                                        2
     32.5396 (-a1 - Sqrt[a1  - 4 a0 a2]) x2   87.1963 (-a1 - Sqrt[a1  - 4 a0 a2]) x1 x2
>    -------------------------------------- + ----------------------------------------- +
                       a2                                        a2

                                         2
                         3 (-a1 - Sqrt[a1  - 4 a0 a2]) x1
>    58.1309 (0.550718 + --------------------------------) x2 +
                                       2 a2

                           2               2
     94.7559 (-a1 - Sqrt[a1  - 4 a0 a2]) x2
>    ---------------------------------------
                       a2