正規(guī)制作網(wǎng)站公司哪家好西安全網(wǎng)優(yōu)化
文章目錄
- 前言
- 一、sympy基本函數(shù)介紹
- 變量定義
- 1. sp.Symbol("x") 或 sp.symbols("m n")
- 2. sp.Function("y")
- 3. func(x).diff(x, n)
- 定義方程與求解符號(hào)
- 1. sp.Eq(lhs, rhs)
- 2. 求解函數(shù)(*代表了常用且重要,其他部分作為拓展,可以有需要的時(shí)候再查詢使用)
- 3. func.subs(a, b) 或者 func.subs({a: b})
- 4. func.evalf(subs, n)
- 二、 常見錯(cuò)誤(持續(xù)更新)
- TypeError: cannot create mpf from x
- TypeError: 'Equality' object is not subscriptable
- 三、計(jì)算模板
前言
本文將針對(duì)常用的函數(shù)進(jìn)行用途分析與介紹,對(duì)代碼過程中可能會(huì)遇到的報(bào)錯(cuò)進(jìn)行分析,并給出實(shí)例幫助理解代碼。文章較長,可以針對(duì)感興趣的部分進(jìn)行跳轉(zhuǎn)
一、sympy基本函數(shù)介紹
變量定義
1. sp.Symbol(“x”) 或 sp.symbols(“m n”)
這是定義變量,如f(x)中的x就是使用Symbol定義的
使用Symbol只能定義一個(gè)變量, 想要一次性定義多個(gè)變量,需要使用symbols,不同的變量之間用空格間隔
2. sp.Function(“y”)
定義函數(shù),相當(dāng)于f(x)中的f,這時(shí)候程序沒法判斷它是誰的函數(shù),需要顯式的定義指定函數(shù)的變量,如f(x)
3. func(x).diff(x, n)
定義函數(shù)關(guān)于x的n階導(dǎo)數(shù)
在求解過程中盡量都采用diff方法,而非使用Derivative()函數(shù)
定義方程與求解符號(hào)
1. sp.Eq(lhs, rhs)
lhs, rhs 分別代表了等式左邊與等式右邊公式
例如y = x就需要表示為sp.Eq(y(x), x)
tip: 如果不是y(x),在求解這個(gè)等式的時(shí)候會(huì)報(bào)錯(cuò)哦,一定要記得定義它是誰的函數(shù)
2. 求解函數(shù)(*代表了常用且重要,其他部分作為拓展,可以有需要的時(shí)候再查詢使用)
函數(shù)名稱 | 用途 | 主要參數(shù) | 說明 | 示例 |
---|---|---|---|---|
solve | 解普通方程的解析解 | f (方程或方程組)symbols (求解的變量)多個(gè)變量或方程需要用 [] 框起來 | 通用函數(shù),用于解一元或多元代數(shù)方程或方程組。 | solve(x**2 - 4, x) # 相當(dāng)于求解 x 2 ? 4 = 0 x^2 - 4 = 0 x2?4=0 # [ -2, 2 ] |
nsolve | 解普通方程數(shù)值解 | f x (待求解變量)x0 (初始猜測值,與結(jié)果有關(guān)) | 用于求方程的數(shù)值解,需要輸入初始猜測值,并尋找該猜測值附近的數(shù)值解。通常返回一個(gè)近似解,也可使用 .evalf() 方法進(jìn)行數(shù)值化。 | nsolve(sin(x) - 0.5, 0) # 因?yàn)槭菑?為初始值,求解 s i n ( x ) = 0.5 sin(x) = 0.5 sin(x)=0.5 最近的答案,所以應(yīng)該是 π 6 \frac{\pi}{6} 6π?約等于0.5236 # 返回的結(jié)果是數(shù)值解 |
dsolve | 解微分方程 | eq (方程)func (求解的函數(shù),如 f(x) )ics (初始條件,可選) | 用于求解一階或高階常微分方程的解析解,支持線性和非線性方程。傳入 ics ,可以直接算出微分方程中的常數(shù)。 | x = symbols(‘x’) f = Function(‘f’)(x) ode = Eq(diff(f, x), f) # 求解最常規(guī)的微分方程 f ′ ( x ) = f ( x ) f'(x) = f(x) f′(x)=f(x) dsolve(ode, f) # [Eq( f ( x ) , C 1 ? e x f(x), C1* e^x f(x),C1?ex)] |
pdsolve | 解偏微分方程 (復(fù)雜一些時(shí)無法直接求解) | eq func | 專門用于求解偏微分方程的解析解,通常需要配合分離變量法。當(dāng)直接輸入的偏微分方程過于復(fù)雜時(shí),先進(jìn)行變量分離再嘗試求解。 | # 一般使用方法類似 dsolve,但處理偏微分方程時(shí) # pdsolve(eq, func) |
linsolve | 解線性方程組 (符號(hào)解) | system symbols | 適合求解線性方程組,返回向量形式的解。 | x, y = symbols(‘x y’) system = [x + y - 2, x - y - 0] linsolve(system, [x, y]) # 求解一個(gè)簡單的線性方程組,記住system里的式子右側(cè)都是0 # { (1, 1) } |
nonlinsolve | 解非線性方程組 (符號(hào)解) | system symbols | 用于求解非線性方程組,返回集合形式的符號(hào)解。 | x, y = symbols(‘x y’) system = [ x 2 + y ? 4 x^2 + y - 4 x2+y?4, x ? y 2 + 1 x - y^2 + 1 x?y2+1] nonlinsolve(system, [x, y]) |
solve_poly_system | 解多項(xiàng)式方程組 (多變量,符號(hào)解) | system symbols | 用于解特定的多項(xiàng)式方程組。 | # 用法與 solve 類似,但主要針對(duì)多項(xiàng)式方程 # solve_poly_system([Eq(…)], [x, y]) |
solve_univariate_inequality | 解一元不等式 | ineq (不等式)symbol (變量) | 用于求解一元不等式,返回區(qū)間形式或邏輯表達(dá)式。 | x = Symbol(‘x’, real=True) ineq = (x**2 < 4) solve_univariate_inequality(ineq, x) # -2 < x < 2 |
reduce_inequalities | 簡化或求解不等式組 | inequalities symbols | 簡化復(fù)雜的不等式組,返回符號(hào)形式的解集。 | x = symbols(‘x’, real=True) reduce_inequalities([[x > 1, x < 3]], [x]) # 1 < x < 3 |
3. func.subs(a, b) 或者 func.subs({a: b})
subs輸入一個(gè)字典或者兩個(gè)參數(shù),可以將變量換成指定的值,如上式中的a替換為了b
例如:
對(duì)于微分方程中輸出的結(jié)果中有C1,在已知某個(gè)初始值(如 y ( 0 ) = 1 2 y(0) = \frac{1}{2} y(0)=21?)的情況下,對(duì)結(jié)果
r e s = E q ( y ( x ) = C 1 e ? x + e x 2 ) res = Eq(y{\left(x \right)} = C_{1} e^{- x} + \frac{e^{x}}{2}) res=Eq(y(x)=C1?e?x+2ex?)進(jìn)行常數(shù)的求解
C1 = sp.Symbol("C1") # 必須先定義C1是一個(gè)變量,才能作為nsolve中的實(shí)參進(jìn)行求解
res = res.subs({y(x): 1/2, x: 0}) # 必須先替換y(x),再替換x
C = sp.nsolve(res, C1, 0) # 這樣就可以解得常數(shù)值
4. func.evalf(subs, n)
evalf是一個(gè)方法,是基于結(jié)果上的方法,可以計(jì)算某個(gè)表達(dá)式的具體值,也可以對(duì)nsolve的結(jié)果進(jìn)行位數(shù)調(diào)整或者
例如:
(1 / a).evalf(subs={a: 2}, n=4)
# 結(jié)果為0.5000
二、 常見錯(cuò)誤(持續(xù)更新)
TypeError: cannot create mpf from x
nsolve(f, x, x0), 這通常與nsolve中沒有初始值有關(guān),設(shè)置一個(gè)初始值就好了
TypeError: ‘Equality’ object is not subscriptable
因?yàn)閐solve解的的結(jié)果是一個(gè)列表,使用dsolve[0]獲取的equality是不可用索引的
只能通過lhs和rhs分別獲得等式左右兩邊的式子
三、計(jì)算模板
- 設(shè)置變量, 利用symbols和Function設(shè)定變量與函數(shù)
- 利用sp.Eq設(shè)置等式
- 使用對(duì)應(yīng)的solve函數(shù)進(jìn)行求解(如有初值注意初值條件帶入)
- (可選)使用subs對(duì)求解的結(jié)果進(jìn)行值代入,再使用nsolve對(duì)某些常量進(jìn)行求解
例子 d y d x + y ( x ) = e x \frac{d y}{d x} + y{\left(x \right)} = e^{x} dxdy?+y(x)=ex
# 1. 進(jìn)行變量設(shè)置
y = sp.Function('y')
x = sp.symbols('x')
y_ = y(x).diff(x) # 直接使用這個(gè)為一階導(dǎo)數(shù)
# 2. 設(shè)置方程
eq = sp.Eq(y_ + y(x), sp.exp(x))
# 3. 求解方程,因?yàn)槭俏⒎址匠趟杂胐solve
res = sp.dsolve(eq, y(x))
sp.pprint(res)# 4. 如果有初值
res = sp.dsolve(eq, y(x), ics={y(0):1}) # 使用ics(初始條件)可以直接求解常量
# 或?qū)Y(jié)果使用sub后利用nsolve求解