【SymPy】(七)方程求解(八)矩陣

2021-02-20 二進位人工智慧

【SymPy】(一)SymPy簡介

【SymPy】(二)使用SymPy需要避開的坑

【SymPy】(三)基本操作(四)列印

【SymPy】(五)簡化

【SymPy】(六)微積分

(七)方程求解

(八)矩陣

1 基本操作

2 基本方法

3 矩陣構造函數

4 先進的方法


(七)方程求解
from sympy import *
x, y, z = symbols('x y z')

1 等式

從前面的文章我們知道,SymPy中的符號方程不是用=或==表示的,而是用Eq表示的。

然而,還有一個更簡單的方法:我們知道a=b相當於a−b=0。在SymPy中,任何不在Eq中的表達式都被SynPy的求解函數(如solveset())假定等於0。這意味著我們可以不使用x==y,而使用x-y(被求解函數認為是x-y==0)。

如果要求解的方程已經等於0,則這一點特別有用。我們在編程時不用鍵入Eq:solveset(Eq(expr,0),x),只需使用solveset(expr,x)即可求解方程。例如:

2 求解代數方程

求解代數方程的主要函數是solveset。其語法為:solveset(equation, variable=None, domain=S.Complexes)

式中,等式可以是Eq實例或表達式的形式(假定為零)。

還有一個函數叫做solve,也可以用來解方程。它的語法為solve(equations, variables),後面會介紹它的用途。

當求解一個等式時,solveset的輸出有:有限集,域,映射集

如果無解,則返回一個空集,如果無法找到解決方案,則返回一個條件集合。

在solveset模塊中,使用linsolve求解線性方程組。下面是linsolve的語法示例:

註:解的順序對應於給定符號的順序。

在solveset模塊中,使用nonlinsolve求解非線性方程組。

下面是nonlinsolve的示例。

註:(1)解的順序對應於給定符號的順序。

(2)nonlinsolve不會返回LambertW形式的解(如果存在LambertW形式解的話)。solve則可用於這種情況:

(3)nonlinsolve不能很好地求解具有三角函數的方程組。solve也可用於此類情況(但不能給出所有解決方案)

solveset只給出每個解。要得到包含多重性的多項式的解,使用roots。

roots的輸出{0: 1, 3: 2}意思是:0是重數為1的根,3是重數為2的根。

solveset 無法求解由LambertW(超越方程求解器)求解的方程。而solve可以:

3 求解微分方程

要求解微分方程,可使用dsolve。首先,通過將cls=function傳遞給symbols函數來創建未定義的函數。

f, g = symbols('f g', cls=Function)

f和g現在是未定義的函數。我們可以調用f(x),它表示一個未知函數。

f(x)的未估值導數:

要求解常微分方程,請將其和要求解的函數傳遞給dsolve。

如求解微分方程:

dsolve返回Eq的一個實例。這是因為一般情況下,微分方程的解不能為函數顯式求解。

dsolve解中的任意常數是C1、C2、C3等形式的符號。

(八)矩陣
from sympy import *

要在SymPy中生成矩陣,使用Matrix對象。通過提供構成矩陣的行向量的列表來構造矩陣。

例如,構造矩陣:

為了便於生成列向量,單獨一個元素列表被認為是列向量

矩陣的操作與SymPy或Python中的任何其他對象一樣。

關於SymPy矩陣需要注意的一點是,與SymPy中的其他對象不同,它們是可變的。這意味著可以對它們進行適當的修改。如果需要Matrix的不可變,請使用ImmutableMatrix。

1 基本操作1.1 獲取矩陣形狀

要得到矩陣的形狀,請使用shape:

1.2 訪問行和列

若要獲取矩陣的單個行或列,請使用row或col。例如,M.row(0)將獲取第一行。M.col(-1)將獲取最後一列。

1.3 刪除和插入行和列

要刪除行或列,請使用row_del或r col_del。這些操作將修改矩陣。

要插入行或列,請使用 row_insert或col_insert。

2 基本方法

簡單的加法和乘法操作僅通過使用+、*和**來完成。要求矩陣的逆,則計算-1次方。

求Matrix的轉置,用T:

3 矩陣構造函數

要創建單位矩陣,請使用eye。eye(n)將創建一個n×n單位矩陣。

zeros(n, m)創造一個 n × m 的零矩陣

相似地,ones創建全1矩陣

要創建對角矩陣,請使用diag。diag的參數可以是數字或矩陣。其中數字被解釋為1×1矩陣。輸入的矩陣按對角線排列。其餘元素用0填充。

4 先進的方法4.1  行列式

要計算矩陣的行列式,請使用det。

4.2 簡化的階梯形式

若要將矩陣轉換為簡化的階梯形式,請使用rref

rref返回兩個元素的元組。第一個元素是簡化的行梯隊形式,第二個元素是主元的列索引。

註:rref返回的元組的第一個元素是Matrix類型。第二種是tuple類型。

4.3 零空間(Nullspace)

要找到矩陣的零空間,請使用nullspace,得到輸出張成矩陣零空間的列向量。使用ASCII Pretty Printer格式輸出:

4.4 列空間(Columnspace)

要找到矩陣的零空間,請使用columnspace,得到輸出張成矩陣列空間的列向量。

4.5 特徵值、特徵向量和對角化(Eigenvalues, Eigenvectors, and Diagonalization)

要求矩陣的特徵值,請使用eigenvals。eigenvals返回一個字典:{特徵值:代數重數}

表示M特徵值有-2、3和5,特徵值-2和3的代數重數為1,特徵值5的代數重數2。

要找到矩陣的特徵向量,請使用eigenvects。返回(特徵值:代數重數,[特徵向量])。

從結果我們也可以知道特徵值5的幾何重數為2,因為它有兩個特徵向量。因為所有特徵值的代數重數和幾何重數是相同的,所以M是可對角化的。

使用diagonalize實現對角化,返回一個元組

Tip:要創建一個名為λ的符號,可以對SymPy符號和Python變量使用相同的名稱——lamda(不帶b)。它可以被列印為λ。

如果只需要特徵多項式,請使用charpoly。這比eigenvals更有效,因為有時符號根的計算成本很高。

相關焦點

  • 【SymPy】(一)SymPy簡介
    在SymPy這樣的符號計算系統中,非完全平方數的平方根在默認情況下不計算:In [5]: import sympyIn [6]: sympy.sqrt(3)Out[6]: sqrt(3)此外,符號結果還可以被符號化地簡化。
  • 用Python解決高數所有計算題--sympy求解極限、積分、微分、二元一次方程等
    Sympy是一個數學符號庫(sym代表了symbol,符號),包括了積分,微分方程等各種數學運算方法,為python提供了強大的數學運算支持。對於圖像來說,雖然都是做離散的計算,操作最多的還是numpy裡的數組,但實際上,這個庫包含了積分微分,三角等最基本的數學運算,可以說是工科最基本的,用起來媲美matlab。
  • Python圈中的符號計算庫-Sympy
    sympy的表達式與我們平常的手寫的數學表達式略微有所區別,下面是sympy的方程表示符號加號 +減號 -除號 /乘號 *等號 Eq()指數 **對數 log()e的指數次冪 exp()上面的例子我們用Python實現一下。
  • Python的武器庫07:sympy模塊
    Python中有這樣一個模塊sympy模塊,可以進行符號計算,可以定義符號變量,進行代數運算,以及微分運算、積分運算等。由於sympy模塊是第三方模塊,因此需要安裝。安裝過程也比較簡單,在windows命令行窗口中,輸入"pip install sympy",點擊enter鍵,就可以安裝最新版本的sympy模塊。
  • 優化 | 利用SciPy求解非線性規劃問題
    該問題可通過求解導數為0的方法來求解。r, h = sympy.symbols("r, h")Area = 2 * sympy.pi * r**2 + 2 * sympy.pi * r * hVolume = sympy.pi * r**2 * hh_r = sympy.solve(Volume - 1)[0]Area_r = Area.subs(h_r)rsol = sympy.solve
  • 定量分析方法第15講:Sympy數學分析基礎II
    定量分析方法第15講:Sympy數學分析基礎II微分、積分、極限、級數;差分,線性方程組,微分方程;符號矩陣。
  • Python2.7安裝sympy模塊
    basic class structure:基本的,及加、乘、指數等 ·Functions:基本的函數和特殊的函數 ·Galgebra:幾何代數 ·Geometry:幾何實體 ·Integrals:符號積分 ·Interactive:交互會話 ·Logic:布爾代數和定理證明 ·Matrices:線性代數和矩陣
  • Scipy入門(求解方程組2)
    一.非線性方程組     在前面我們討論的大多數是關於未知數的線性方程組,本節主要討論非線性方程組,簡單的理解為不是關於未知數(不一定是x)的一次方程,比如我們熟悉的x^2-4x+3=0這種方程組但是這種方程比較簡單,我們可以利用一些公式直接解出其解,但是對於x^3-sin(x)=0這種方程,我們是沒有通用公式的解出它的解,這時我們就要採取一些其他方法來求解。
  • Matlab:代數方程求解—solve命令
    點擊上方藍字關注 無距書鄉 獲取即時更新之前在《Matlab:矩陣的秩,簡化梯形矩陣和線性方程組
  • 有限差分法之熱傳導方程的求解
    偏微分方程的數值求解在數值分析中佔有重要地位,很多科學技術問題的數值計算都包括了偏微分方程的數值解問題。
  • 線性回歸的求解:矩陣方程和梯度下降、數學推導及NumPy實現
    各個向量和矩陣形狀如下面公式所示。使用這種方法求最優解,其實是在解這個矩陣方程,英文中稱這種方法為Normal Equation。用通俗的話來講,樣本中的數據必須足夠豐富,且有足夠的代表性,矩陣方程才有唯一解,否則矩陣方程會有多組解。如果特徵有上萬維,但只有幾十個樣本來訓練,我們很難得到一個滿意的最優解。
  • 在R裡面對三元一次方程求解
    三元一次方程大家應該是不陌生的,形如 aX + bY + cZ = d 的就是,其中X,Y,Z是未知的變量,a,b,c,d 都是已知的常量,通常呢,需要至少3個沒有線性關係的已知等式才能求唯一解。我搜索了一下,是如下3個步驟:①利用代入法或加減法,消去一個未知數,得出一個二元一次方程組;③將這兩個未知數的值代入原方程中較簡單的一個方程,求出第三個未知數的值,把這三個數寫在一起的就是所求的三元一次方程組的解。那麼,如果是要在R裡面操作呢,這個時候矩陣的思想就可以幫上忙了。
  • 求解微分方程
    一般地,微分方程的不含有任意常數的解稱為微分方程的特解,含有相互獨立的任意常數,且任意常數的個數與微分方程階數相等的解稱為微分方程的通解(一般解)。下面介紹微分方程的求解方法。的一階微分方程稱為齊次微分方程,簡稱齊次方程。通過變量替換,可以將這類方程化為可分離變量的方程來求解。
  • 線性代數拾遺(一):線性方程組、向量方程和矩陣方程
    注意,這個系列假設你已經有了線性代數基礎,像是行變換、將矩陣轉換為行階梯形式這種基本技巧已經掌握。本文不再贅述具體操作步驟,主要關注於概念的直觀理解。線性方程組、向量方程和矩陣方程一、線性方程組線性代數,最基本的問題,就是解線性方程組了。
  • (C++實現)有限差分法(FDM)求解雷諾方程
    本文選擇了五點差分格式進行求解。不同類型的節點其差分格式的構建不同,具體數學過程本文不在贅述,詳細過程可以查閱關於偏微分方程的教科書。同樣通過虛基類(Solver)將不同類型節點的差分格式提供了統一的接口,並在子類(SolverSquare)中對其差分方程構建進行實現。
  • 薛定宇教授大講堂(卷Ⅴ):MATLAB微分方程求解|文末贈書
    2.2.4 Legendre微分方程與 Legendre函數  192.2.5 Airy函數  202.3常係數線性微分方程的求解  212.3.1線性常係數微分方程解析解的數學描述  212.3.2基於 Laplace變換的求解方法 222.3.3非齊次微分方程的求解  242.3.4非零初值的微分方程求解
  • FEALPy 有限元求解 Poisson 方程示例
    下面我想用一系列文章,介紹幾類常見方程的算例,讓大家對 FEALPy 能做什麼有個大概的了解,同時也想得到一些反饋,明確 FEALPy 下一步的改進方向。關於有限元編程的技巧細節,我會在其它系列的文章中寫。
  • 北師大版八年級上5.2 求解二元一次方程組
    二元一次方程的計算機解法在採用Sympy來解含有小數的一元一次方程這篇文章中,我們已經學過了python中的sympy這個軟體包解方程的強大功能,在這裡,我們再次展現一下它的威力,首先將方程組中每一個方程均寫成右側0的格式,然後將它們定義成一個列表,最後調用sympy中的solve來解方程,代碼如下:通過上述代碼運行結果,我們可以看出計算機解算出的答案和我們的答案完全一致。
  • 一元二次方程求解過程推導
    一元二次方程的解法主要有配方法、公式法和因式分解法等。首先介紹配方法。將一元二次方程化為如下形式若解得以上是用配方法求解一元二次方程的過程,目的就是為了等式左邊配成一個完全平方式,如果等式右邊為非負,則方程在實數範圍內有解。公式法其實就是把上述用配方法求出的結果直接當成公式來用。