sympy求积分|微分|极限|解微分方程|解RLC震荡电路

运用python的sympy工具包,可以方便的对相应的方程进行求解。在上一篇文章中,我们用sympy解了复杂的非线性方程组、复数方程组、多元多次方程组,链接如下:

python求解多元多次方程组或非线性方程组 

Sympy中有详细的官方文档和相应的例子:官方文档地址:Welcome to SymPy’s documentation! — SymPy 1.10.dev documentation

ODE(微分方程组)应用实例:ODE — SymPy 1.10.dev documentation

目录

一、求解方程和方程组

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官方地址:GitHub - sympy/sympy: A computer algebra system written in pure Python

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))]

 复杂的问题终于解出,有四组实数解!

二、高等数学相关

sympy计算极限,微分,偏微分,积分

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操作系统基础知识 

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 好的,我可以为您演示如何使用SymPy微分方程。首先,您需要安装SymPy包并导入它。您可以使用以下命令来安装SymPy: ``` !pip install sympy ``` 然后,您可以在Python中导入SymPy: ```python import sympy as sp ``` 接下来,您可以使用SymPy的dsolve函数来微分方程。例如,考虑以下一阶线性微分方程: ``` y' + y = x ``` 首先,我们需要定义未知函数y和自变量x: ```python x = sp.Symbol('x') y = sp.Function('y')(x) ``` 然后,我们可以使用dsolve函数来微分方程: ```python sp.dsolve(y.diff(x) + y - x, y) ``` 这将输出以下结果: ``` Eq(y(x), C1*exp(-x) + x - 1) ``` 其中C1是一个任意常数。因此,为: ``` y(x) = C1*exp(-x) + x - 1 ``` 希望这个例子能够帮助您了如何使用SymPy微分方程。 ### 回答2: Sympy是一个用于符号数学的Python库,可以用于求微分方程。使用Sympy微分方程的过程如下: 首先,我们需要导入Sympy库和必要的数学函数。例如,我们可以使用以下代码导入所需的库: ```python from sympy import symbols, Eq, Function, Derivative, dsolve ``` 接下来,我们需要定义微分方程。我们可以使用Sympy中的`symbols`函数创建所需的符号变量,并使用`Function`函数创建待求的函数。例如,我们可以使用以下代码定义一个一阶线性常微分方程: ```python x = symbols('x') y = Function('y')(x) equation = Eq(Derivative(y, x) + y, x) ``` 现在,我们可以使用`dsolve`函数对微分方程进行求。它将返回一个包含常数的通。例如,我们可以使用以下代码求上述定义的微分方程: ```python solution = dsolve(equation) ``` 最后,我们可以打印求的结果。这将给出微分方程的通。例如,我们可以使用以下代码打印求结果: ```python print(solution) ``` 通过上述过程,我们可以使用Sympy微分方程。我们只需要定义微分方程、使用`dsolve`函数求,并打印结果即可获得微分方程。 ### 回答3: SymPy是一个强大的Python库,可用于决各种数学问题,包括求微分方程。 要使用SymPy微分方程,首先需要导入SymPy库和它的子模块,如下所示: ``` from sympy import symbols, Function, Eq, dsolve ``` 然后,我们定义微分方程中的未知函数和自变量。通常,我们使用symbols函数来创建这些符号。例如,假设我们要微分方程是dy/dx = x,可以这样定义未知函数y和自变量x: ``` x = symbols('x') y = Function('y')(x) ``` 接下来,我们可以使用Function和symbols函数定义微分方程。例如,可以这样定义上述微分方程: ``` diff_eq = Eq(y.diff(x), x) ``` 然后,我们可以使用dsolve函数求微分方程。通过传递diff_eq作为参数,我们可以得到微分方程的通。例如,可以这样求上述微分方程: ``` solution = dsolve(diff_eq) ``` 最后,我们可以通过打印来查看结果: ``` print(solution) ``` 以上是使用SymPy微分方程的一般过程。根据具体的微分方程和条件,你可能需要进一步设置初始条件或边界条件。此外,SymPy还提供了许多其他函数和方法,可用于更高级的微分方程和操作。 总结起来,使用SymPy微分方程的步骤包括导入库和模块、定义未知函数和自变量、设置微分方程、利用dsolve求方程,然后打印结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祥瑞Coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值