sympy求積分|微分|極限|解微分方程|解RLC震盪電路

如果遇到難解的方程組,需要博主幫忙解,可閒魚搜索:代解方程組,即可。運用python的sympy工具包,可以方便的對相應的方程進行求解。在上一篇文章中,我們用sympy解了複雜的非線性方程組、複數方程組、多元多次方程組,鏈接如下:

python求解多元多次方程組或非線性方程組

Sympy中有詳細的官方文檔和相應的例子:官方文檔地址:https://docs.sympy.org/dev/index.html

ODE(微分方程組)應用實例:https://docs.sympy.org/dev/modules/solvers/ode.html#

目錄

一、求解方程和方程組

1.1 二元一次方程組

1.2 多解

1.3 複數解

1.4 非線性求解

1.5 較爲複雜的二元二次方程

二、高等數學相關

2.1 求微分積分和偏微分

2.2 三角函數化簡

三、求解較難的問題

3.1 求解RLC震盪電路


一、求解方程和方程組

python求解方程組的工具包較多。例如:

  •  numpy:numpy.linalg.solve 可以直接求解線性方程組,numpy是python非常常用的包,解的方程也較爲初級。
  •  scipy:from scipy.optimize import fsolve,可以求解非線性方程組,使用較爲方便,但是解集並不完備,可能漏掉一下解(後文會給個例子)scipy可以用於數學、科學、工程領域的常用軟件包,可以處理插值、積分、優化,相對較初級易用
  •  sympy:此工具包功能相對強大,支持符號計算、高精度計算、解方程、微積分、組合數學、離散數學、幾何學、概率與統計、物理學等方面的功能。github地址:https://github.com/sympy/sympy
  •  sage,不支持位運算,z3約束求解器,等其他工具包,本文不詳述,感興趣的可以查找相應的內容。

本文詳細講述scipy以及sympy求解多次方程的方法。

沒安裝可以在teiminal中pip install sympy,此工具包涉及支持符號計算、高精度計算、模式匹配、繪圖、解方程、微積分、組合數學、離散 數學、幾何學、概率與統計、物理學等方面的功能。功能較爲強大,解方程組時性能也較好。

sympy官方地址:https://github.com/sympy/sympy

1.1 二元一次方程組

較爲簡單,

from sympy import *
# 二元一次方程
x = Symbol('x')
y = Symbol('y')
solved_value=solve([2*x+y-1, x-2*y], [x, y])
print(solved_value)

此方法較爲簡單,但是相應的自變量應當寫成符號的形式,x=Symbol('x')

求解後有分數解:

{x: 2/5, y: 1/5}
Program done!

1.2 多解

多解情況與複數解

例如,多個解的情況,sympy可以很好的進行求解

    x = Symbol('x')
    solved_value=solve([x**2-9], [x])
    print(solved_value)

輸出結果:

[(-3,), (3,)]

1.3 複數解

複數解也可以很好解出:

    # 複數解
    solved_value = solve([x ** 2 + 9], [x])
    print(solved_value)
    solved_value = solve([x ** 4 - 9], [x])
    print(solved_value)
"""
運行結果:
[(-3*I,), (3*I,)]
[(-sqrt(3),), (sqrt(3),), (-sqrt(3)*I,), (sqrt(3)*I,)]
"""

複數解也能較好解出

1.4 非線性求解

比如三角函數:

 程序均能較好解出

    # 非線性解
    solved_value = solve([sin(x) - 0.5], [x])
    print(solved_value)
    solved_value = solve([sin(x) - 1], [x])
    print(solved_value)

"""
[(0.523598775598299,), (2.61799387799149,)]
[(pi/2,)]
"""

1.5 較爲複雜的二元二次方程

 此題較難,無論人來算,很難算出,用scipy工具包也迭代不出解。但是sympy強大的功能可以很好的解出此方程。

    # 二元二次方程組
    x = Symbol('x')
    y=  Symbol('y')
    solved_value=solve([x**2+2*x*y-6,2*x*y-2*y**2+3], [x,y])
    print(solved_value)

有四組實數解:

[(-(-3 + sqrt(13))*sqrt(sqrt(13)/2 + 2), -sqrt(sqrt(13)/2 + 2)),
 ((-3 + sqrt(13))*sqrt(sqrt(13)/2 + 2), sqrt(sqrt(13)/2 + 2)), 
(-sqrt(2 - sqrt(13)/2)*(-sqrt(13) - 3), -sqrt(2 - sqrt(13)/2)), 
(sqrt(2 - sqrt(13)/2)*(-sqrt(13) - 3), sqrt(2 - sqrt(13)/2))]

 複雜的問題終於解出,有四組實數解!

二、高等數學相關

http://www.360doc.com/content/13/1105/05/9934052_326838602.shtml

2.1 求微分積分和偏微分

定積分,不定積分等均可進行運算。

    x=Symbol('x')
    y=atan(x)
    print("一階導數:",end=' ')
    print(diff(y,x,1)) #一階導數
    print("二階導數:",end=' ')
    print(diff(y,x,2)) #二階導數
    print("積分:",end=' ')
    print(integrate(y,x))  #積分
    print("定積分:", end=' ')
    print(integrate(y, (x,0,3*pi/2)))   #定積分
    print("廣義積分:", end=' ')
    print(integrate(y, (x, 0, +oo)))  # 廣義積分
    print('以下爲多元方程:')
    a = Symbol('a')
    y2=atan(x+a)
    print("偏導一階:", end=' ')
    print(diff(y2,x,1)) #偏導一階
    print("偏導二階:", end=' ')
    print(diff(y2,x,2)) #偏導二階
    print("積分:",end=' ')
    print(integrate(y2,x))  #積分
    print("定積分:", end=' ')
    y3=exp(-(x+a+1))
    print(integrate(y3, (x,0,3*pi/2)))   #定積分
    print("廣義積分:", end=' ')
    print(integrate(y3, (x, 0, +oo)))  # 廣義積分

運行結果:

一階導數: 1/(x**2 + 1)
二階導數: -2*x/(x**2 + 1)**2
積分: x*atan(x) - log(x**2 + 1)/2
定積分: -log(1 + 9*pi**2/4)/2 + 3*pi*atan(3*pi/2)/2
廣義積分: oo
以下爲多元方程:
偏導一階: 1/((a + x)**2 + 1)
偏導二階: -2*(a + x)/((a + x)**2 + 1)**2
積分: a*atan(a + x) + x*atan(a + x) - log(a**2 + 2*a*x + x**2 + 1)/2
定積分: exp(-a - 1) - exp(-a - 3*pi/2 - 1)
廣義積分: exp(-1)*exp(-a)

2.2 三角函數化簡

類似於這種:

    #三角函數
    x=Symbol('x')
    print(cos(3*pi/2-x))
    print(cos(3 * pi / 2 + x))

'''
運行結果:
-sin(x)
sin(x)
'''

直接輸出即可化簡。

三、求解較難的問題

3.1 求解RLC震盪電路

工程數學和複變函數中,經常遇到一種問題,就是RLC的震盪電路。此類問題,較爲複雜,需要微分方程和電路的知識相結合。但是,如果能將相應的方程寫出,則問題會簡化很多。

例如此類問題:

 諸如此類的問題有很多,可以看出左邊是電路項,右邊是激勵項。但是隻要能寫出公式,sympy即可根據公式給出相應的解。

    #求解微分方程
    u = Function('u')
    t = Symbol('t',real=True)
    L = Symbol('L',real=True)
    C = Symbol('C', real=True)
    R = Symbol('R', real=True)
    w = Symbol('w', real=True)
    M = Symbol('M',real=True)
    eq=L*C*u(t).diff(t,2)+R*C*u(t).diff(t,1)+u(t)-M*cos(w*t)

    #eq2= u(t).diff(t,2)+2*u(t).diff(t,1)-u(t)
    print(dsolve(Eq(eq,0),u(t)))

得出解爲:

Eq(u(t), -C*L*M*w**2*cos(t*w)/(C**2*R**2*w**2 + (C*L*w**2 - 1)**2) + 
C*M*R*w*sin(t*w)/(C**2*R**2*w**2 + (C*L*w**2 - 1)**2) + 
C1*exp(t*(-R - sqrt(C*(C*R**2 - 4*L))/C)/(2*L)) + 
C2*exp(t*(-R + sqrt(C*(C*R**2 - 4*L))/C)/(2*L)) + 
M*cos(t*w)/(C**2*R**2*w**2 + (C*L*w**2 - 1)**2))

寫爲公式形式:

 至此,這個較難的工程數學方程就得到了較好的解決。如果遇到難解的方程組,需要博主幫忙解,可閒魚搜索:代解方程組,即可。

 

 

博主其他文章:

python求解多元多次方程組或非線性方程組

博客文章總目錄-邢翔瑞的技術博客

雙拼輸入法的原理及上手方法

對2020算法崗秋招的同學們的一些建議

python實現logistic增長模型擬合2019-nCov確診人數2月1日更新

python實現logistic增長模型擬合2019-nCov確診人數

支持向量機(Support Vector Machine,SVM)算法複雜度詳解

linux操作系統基礎知識

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章