利用python中的sympy模块求导和解方程
对sympy这个模块我不是很了解,我学习python主要是想往机器学习和深度学习方向发展。这次了解到有这个模块,是因为有同学在写论文中要用到求导,并且计算量相当大。我才知道python里面有这么好用的模块。写下来,一方面是供大家学习参考,另一方面也是加深自己的印象。若有错误的地方,还请大家批评指正!😀☀😄
1.求导
from sympy import *
x, y, z = symbols('x, y, z') # 定义变量x,y,z
f = z**x + ln(x*y) + sin(x*y) + tan(x**z) # 定义目标函数
print('目标函数:f=',f)
print('------')
# 对x求偏一介导
dx = diff(f, x)
print('对x求一阶偏导:dx=', dx)
# 对x求偏二介导
print('------')
dx_2 = diff(f, x, 2)
print('对x求二阶偏导:dx_2=', dx_2)
# 先对x求导再对y求导
print('------')
dx_dy = diff(dx, y)
print('先对x求导再对y求导:dx_dy=', dx_dy)
结果:
目标函数:f= z**x + log(x*y) + sin(x*y) + tan(x**z)
------
对x求一阶偏导:dx= y*cos(x*y) + z**x*log(z) + x**z*z*(tan(x**z)**2 + 1)/x + 1/x
------
对x求二阶偏导:dx_2= -y**2*sin(x*y) + z**x*log(z)**2 + 2*x**(2*z)*z**2*(tan(x**z)**2 + 1)*tan(x**z)/x**2 + x**z*z**2*(tan(x**z)**2 + 1)/x**2 - x**z*z*(tan(x**z)**2 + 1)/x**2 - 1/x**2
------
先对x求导再对y求导:dx_dy= -x*y*sin(x*y) + cos(x*y)
但是,我发现个问题:在sympy模块中没有反三角函数。如果我用numpy去操作,则会报错。
from sympy import *
import numpy as np
x = symbols('x') # 定义变量x
f = np.arcsin(x) # 定义目标函数
报错:
AttributeError Traceback (most recent call last)
AttributeError: 'Symbol' object has no attribute 'arcsin'
The above exception was the direct cause of the following exception:
TypeError Traceback (most recent call last)
<ipython-input-5-8d85f13312a8> in <module>
3
4 x, y, z = symbols('x, y, z') # 定义变量x,y,z
----> 5 f = np.arcsin(x) # 定义目标函数
TypeError: loop of ufunc does not support argument 0 of type Symbol which has no callable arcsin method
2.解方程
2.1 多元一次方程
"""
4*x + y + z + 2 = 0
2*x - y + z = 0
x - y + z - 1 = 0
"""
from sympy import *
x, y, z = symbols('x, y, z') # 定义变量x,y,z
f1 = 4*x + y + z + 2
f2 = 2*x - y + z
f3 = x - y + z - 1
result = solve([f1, f2, f3], [x, y, z])
结果:
result: {x: -1, y: 0, z: 2}
2.2 非线性方程
"""
x^2 + y^(1/2) - 17 = 0
x^(1/2) 1 y^3 - 2 = 0
"""
from sympy import *
x, y = symbols('x, y')
f1= x**2 + sqrt(y) - 17
f2 = sqrt(x) - y**3 - 1
result = solve([f1, f2], [x, y])
print("result:", result)
结果:
result: {x: 4, y: 1}
上面这个方程是我在定好答案的情况下编的,但用python运行了好长时间都没运行出来,感觉电脑都快烧了😂。我就把这个答案写上去了,不知道有没有其它答案,大家可以自己运行下😁。
2.3 微分方程
"""
f(x)'' - 2f(x)' + 2f(x) = cos(x)
"""
from sympy import *
f = symbols('f', cls=Function)
x = symbols('x')
eq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + 2*f(x), cos(x))
print(dsolve(eq, f(x)))
结果:
Eq(f(x), (C1*sin(x) + C2*cos(x))*exp(x) - 2*sin(x)/5 + cos(x)/5)