python中的sympy模块求导和解方程

1 篇文章 0 订阅
1 篇文章 0 订阅

利用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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值