pythonを用いた一般方程式の解法(Sympy or Scipy)(非線形方程式群,一元二次方程式,多重一次方程式,因数分解など)

18653 ワード

前言
科学計算では、数値計算、高数、線形代数などに遭遇することが多く、実際の解題では面倒になる可能性があり、エラーになる可能性があります.ここではpythonが科学計算で線形方程式グループについて簡単に紹介します.
pythonを使用して線形方程式グループを解く場合は、対応するパッケージ、scipy、sympyをインストールする必要があります.公式ドキュメントはそれぞれhttps://www.scipy.org/、https://docs.sympy.org/latest/index.html.
scipy非線形方程式グループの解
線形方程式のグループを解くのは簡単で、1つの関数(scipy.linalg.solve)だけでいいです.例えば、非整列線形方程式のグループである以下の方程式の解を要求します.
3 x 1 + x 2 − 2 x 3 = 5 x 1 − x 2 + 4 x 3 = − 2 2 x 1 + 3 x 3 = 2.5 3x_1+x_2-2x_3=5\\x_1-x_2+4x_3=-2\\2x_1+3x_3=2.5 3x1​+x2​−2x3​=5x1​−x2​+4x3​=−22x1​+3x3​=2.5
プログラムコード:
import numpy as np
from scipy.linalg import solve
#      
a=np.array([[3,1,-2],[1,-1,4],[2,0,3]])
# 
b=np.array([5,-2,2.5])
#  
x=solve(a,b)
#    
print(x)

結果:
[0.5 4.5 0.5]
[Finished in 1.2s]

sympy数学方程式の解
SymPyは比較的強力で、記号の簡略化、評価などを行うことができます.SymPyはシンボル数学のPythonライブラリです.コードの簡潔さ、理解と拡張を維持しながら、全機能のコンピュータ代数システムになることを目標としています.SymPyは完全にPythonで書かれており、外部のライブラリは必要ありません.
変数を設定してから、値を設定する必要のない機能を印刷することができます.たとえば、私たちの日常の書き込みではprint(x+y)が間違っていますが、次のように使用しても間違っていません.
from sympy import *
x,y= symbols('x,y')
print(x + y)

方程式の表示
数式とコードの変換:
  • プラス+
  • マイナス-
  • 除算/
  • 乗*
  • 指数**
  • 対数log()
  • eの指数次べき乗exp()
  • 簡単な方程式の解2x-4=0の1元の1回の方程式に対して解きます
    from sympy import *
    x= symbols('x')
    print(solve(x*2-4,x))
    

    結果:
    [2]
    [Finished in 1.3s]
    

    説明する必要があるのは、solve:最初のパラメータは解を求める方程式であり、右端が0に等しく、2番目のパラメータは解を求める未知数である.他にもいくつかのパラメータがあり、知りたいことは公式ドキュメントを見ることができます.
    二元一次方程式方程式の解
    方程式を解く:
    2 x − y = 3 3 x + y = 7 2x-y=3\\3x+y=7 2x−y=33x+y=7
    from sympy import *
    x,y= symbols('x,y')
    print(solve([2*x-y-3,3*x+y-7],[x,y]))
    

    結果:
    {x: 2, y: 1}
    [Finished in 1.2s]
    

    一元二次方程式の解
    検索:
    x 2 + 2 x + 1 = 0 x^2+2x+1=0 x2+2x+1=0
    from sympy import *
    x= symbols('x')
    print(solve(x**2+2*x+1,x))
    

    結果:
    [-1]
    [Finished in 1.0s]
    

    多項式化簡略化計算
    from sympy import *
    x,a= symbols('x,a')
    #        ,        
    result_or=solve(x**2+a**2,x)
    print(result_or)
    #    ,    a=3
    for temp in result_or:
    	print(temp.subs([(a,3)]))
    

    結果:
    [-I*a, I*a]
    -3*I
    3*I
    [Finished in 1.2s]
    

    拡張sympy計算の使用
    八元の一回の方程式を解いて、興味があるのは少し理解することができます
    from sympy import *
    
    a1,b1,c1,d1,a2,b2,c2,d2=symbols('a1,b1,c1,d1,a2,b2,c2,d2')
    x0,x1,x2,y0,y1,y2=symbols('x0,x1,x2,y0,y1,y2')
    result=solve([a1+b1*x0+c1*x0*x0+d1*x0*x0*x0-y0,
    	a1+b1*x1+c1*x1*x1+d1*x1*x1*x1-y1,
    	a2+b2*x1+c2*x1*x1+d2*x1*x1*x1-y1,
    	a2+b2*x2+c2*x2*x2+d2*x2*x2*x2-y2,
    	b1+2*c1*x1+3*d1*x1*x1-b2-2*c2*x1-3*d2*x1*x1,
    	c1+3*d1*x1-c2-3*d2*x1,
    	c1+3*d1*x0,
    	c2+3*d2*x2],[a1,b1,c1,d1,a2,b2,c2,d2])
    #    
    cs=[(x0,6),(x1,9),(x2,12),(y0,0),(y1,3),(y2,0)]
    
    # print(result[a1])
    # print(result[b1])
    # print(result[c1])
    # print(result[d1])
    # print(result[a2])
    # print(result[b2])
    # print(result[c2])
    # print(result[d2])
    
    a1=result[a1].subs(cs)
    b1=result[b1].subs(cs)
    c1=result[c1].subs(cs)
    d1=result[d1].subs(cs)
    a2=result[a2].subs(cs)
    b2=result[b2].subs(cs)
    c2=result[c2].subs(cs)
    d2=result[d2].subs(cs)
    print(a1)
    print(b1)
    print(c1)
    print(d1)
    print(a2)
    print(b2)
    print(c2)
    print(d2)