×

解微分方程与矩阵化简的实现

admin admin 发表于2017-01-11 12:57:19 浏览2066 评论0

抢沙发发表评论

解微分方程

例题:

此处输入图片的描述

符号表示与等式表示

这里与之前不同的是增加了函数的表示(用f(x)表示y),即例题中的y还有微分表示

from sympy import *
f = Function('f')
x = Symbol('x')

下面是表示y'

diff(f(x),x)

这里稍微介绍一下diff函数

例子:

>>> diff(sin(x),x)
cos(x)
>>> diff(x**3,x)
3*x**2

上面都是一阶导,你会问高阶导怎么办?好办。

>>> diff(x**3,x)3*x**2
>>> diff(x**3,x,1)
3*x**2
>>> diff(x**3,x,2)
6*x
>>> diff(x**3,x,3)
6
>>> diff(x**3,x,4)
0

改变第三个参数即可。

下面继续我们的解题过程。

#左端
diff(f(x),x)
#看一下
print(diff(f(x),x))
#result
#d
#--(f(x))
#dx
#右端
2*f(x)*x

用dsolve函数解微分方程

dsolve函数是用来解决微分方程(differential equation)的函数。

函数的一个用法为:

dsolve(eq, f(x))

第一个参数为微分方程(要先将等式移项为右端为0的形式)。第二个参数为要解的函数(在微分方程中)

举个例子:

>>> from sympy import *
>>> f = Function('f')
>>> x = Symbol('x')
>>> pprint(2*x-diff(f(x),x))
      d
      2*x - --(f(x))
      dx
>>> dsolve(2*x - diff(f(x),x), f(x))
#result
#Eq(f(x), C1 + x**2)

这样,我们可以将我们要解的题目,用以下代码表示。

dsolve(diff(f(x),x) - 2*f(x)*x, f(x))

结果为:

Eq(f(x), C1*exp(x**2))#即f(x) = C1*exp(x**2)

对比答案可以发现正确。

完整代码:

from sympy import *
f = Function('f')
x = Symbol('x')
print dsolve(diff(f(x),x) - 2*f(x)*x,f(x))

矩阵化简

平时线性代数问题中我们会遇到化简问题,虽然不算难,但着实麻烦。而且,出一点错就会导致 结果出错。不过好运的是SymPy提供了相关的支持。

例题:

此处输入图片的描述

符号表示与矩阵表示

from sympy import *
x1,x2,x3 = symbols('x1 x2 x3')
a11,a12,a13,a22,a23,a33 = symbols('a11 a12 a13 a22 a23 a33')
m = Matrix([[x1,x2,x3]])
n = Matrix([[a11,a12,a13],[a12,a22,a23],[a13,a23,a33]])
v = Matrix([[x1],[x2],[x3]])

注意m的表示,需要有两个中括号

化简实现

print m * n * v

得到的是:

Matrix([[x1*(a11*x1 + a12*x2 + a13*x3) + x2*(a12*x1 + a22*x2 + a23*x3) + x3*(a13*x1 + a23*x2 + a33*x3)]])

使用

f = m * n * vprint f[0]

可以进一步得到化简后的式子

也许你要问我要化简后在计算怎么办?下面我就举个例子。 如果上式中x1,x2,x3均等于1,则可这样代入。

from sympy import *
x1,x2,x3 = symbols('x1 x2 x3')
a11,a12,a13,a22,a23,a33 = symbols('a11 a12 a13 a22 a23 a33')
m = Matrix([[x1, x2, x3]])
n = Matrix([[a11, a12, a13], [a12, a22, a23], [a13, a23, a33]])
v = Matrix([[x1], [x2], [x3]])
f = m * n * vprint f[0].subs({x1:1, x2:1, x3:1})

可得

a11 + 2*a12 + 2*a13 + a22 + 2*a23 + a33

总结

上文介绍了如何解微分方程和如何进行矩阵化简,当然都只是非常简单的例子。但希望能给大家带来一些启发。


转载自:https://www.shiyanlou.com/courses/729/labs/2401/document

分享到:

群贤毕至

访客