sympy庫的使用(六)解方程


一、方程式

SymPy中方程式不是用“=”表示相等,而是使用Eq

from sympy import *
x, y, z = symbols('x y z')
init_printing(use_unicode=True)

Eq(x, y)

 

還可以這樣表達

solveset(Eq(x**2, 1), x)

solveset(Eq(x**2 - 1, 0), x)

#這里默認等於0
solveset(x**2 - 1, x)

 

 

二、求解方程

求解方程是要函數是solveset,使用語法是solveset(equation, variable=None, domain=S.Complexes),分別是等式(默認等於0,),變量,定義域。

請注意,函數solve也可以用於求解方程式,solve(equations, variables)

solveset(x**2 - x, x)

solveset(x - x, x, domain=S.Reals)

solveset(sin(x) - 1, x, domain=S.Reals)

 

 如果是無解,返回空,如果找不到解,返回表達式

solveset(exp(x), x)     # No solution exists

solveset(cos(x) - x, x)  # Not able to find solution

 

 

三、求線性方程組

求解線性方程組linsolve

方程列表形式:

linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))

 

 矩陣形式:

只寫前面的系數

linsolve(Matrix(([1, 1, 1, 1], [1, 1, 2, 3])), (x, y, z))

 A * x = b形式

M = Matrix(((1, 1, 1, 1), (1, 1, 2, 3)))
system = A, b = M[:, :-1], M[:, -1]
system
linsolve(system, x, y, z)

 

 

四、求非線性方程組

非線性方程組就是自變量和因變量不是線性關系

求解非線性方程組 的函數是nonlinsolve

1.當存在實解時

這個例子我不明白是什么意思,為什么這個解時這個??

a, b, c, d = symbols('a, b, c, d', real=True)
nonlinsolve([a**2 + a, a - b], [a, b])
nonlinsolve([x*y - 1, x - 2], x, y)

 

 現在解讀一下上面2個例子

第一個:a**2+a = 0,a-b=0,a**2+a=0推出a=0或者a=-1,將2個解代入a-b=0,即可得到b=0或者b=-1

第二個:x*y-1=0,x-2=0,前面等式推出y=1/x,后面等式推出x=2,就得到結果了

 

2.當存在復數解時

都看不懂這個復數,直接跳過,復數使用的也不多

nonlinsolve([x**2 + 1, y**2 + 1], [x, y])

 

 

3.存在真實和復數解時,實部虛部

from sympy import sqrt
system = [x**2 - 2*y**2 -2, x*y - 2]
vars = [x, y]
nonlinsolve(system, vars)

 

 

4.具有無數個解

下面這個例子,第一個表達式x*y=0,推出x=0,y任意數或者y=0,x任意數,第二個表達式x*y-x=0 可以簡化x*(y-1)=0推出x=0,y任意數或者y=1,x任意數,綜合一起可得,x=0,y任意數

nonlinsolve([x*y, x*y - x], [x, y])

 

 

5.注意點

(1)解的順序與給定符號的順序相對應,也就是說解和對應變量對應

(2)如果nonlinsolve返回的是數值,熱不是表達式,如果返回的是表達式,可以使用solve

(3)nonlinsolve尚不能解三角函數的方程組,但是solve可以(但不能給出所有的解,因為三角函數的解實在是太多了,無限循環的)

solve([sin(x + y), cos(x - y)], [x, y])

 

 solveset會得到多個解,roots會得到第一個跟是什么,第二個跟是什么,跟和第幾以字典形式

 

五、解微分方程

定義一個未知方程的微分

f, g = symbols('f g', cls=Function)
f(x).diff(x)

 

 表示微分方程 f′′(x)2f(x)+f(x)=sin(x)因此我們將使用

diffeq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x))
diffeq

 

 解微分方程

dsolve(diffeq, f(x))

 

 解未知表達式的微分方程

dsolve(f(x).diff(x)*(1 - sin(f(x))) - 1, f(x))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM