目录
求导在优化编程、数学建模等方面被广泛的应用,我最近使用python编程,希望能够找出一个能对任何函数求导的方法,我搜遍了全网,零零散散,为此我写下这篇文章,主要解决了交互式输入函数求导,基本初等函数求导,包括幂函数、指数函数、三角函数,对数函数,反三角函数。
1.自定义函数求一阶导数、二阶倒数,并带入数值
为了增强对求导的灵活性,编写了一段代码,以便可以手动输入函数。求出求导式,和带数值。
导入相关的包
from sympy import *
import matplotlib.pyplot as plt
import pylab
import numpy as np
以最常见的一元多次数函数求导为例作为输入的函数,求一次导数,二次倒数带值
x = symbols('x')
fun = eval(input("请输入函数"))
print("一阶求导")
fun_1 = diff(fun,x)
print(fun_1)
fun_2 = diff(fun_1,x)
print("二阶求导")
print(fun_2)
number_1 = float(input("请输入x的取值"))
print("一阶导数代数运算后的结果为:{:.5f}".format(fun_1.subs(x,number_1)))
print("二阶导数代数运算后的结果为:{:.5f}".format(fun_2.subs(x,number_1)))
即需要输入:2*x**3+5*x**2+x+5
我们这里将x的数值设为i 2,运行得如下图。
对于这个方法,优势在于可以修改输入函数的类型。
2.指数函数求导
我们这里求导的海曙改为
输入2**x+1即可,求解一次导数
带入数值0
from sympy import *
x = symbols('x')
fun = eval(input("请输入函数"))
print("一阶求导")
fun_1 = diff(fun,x)
print(fun_1)
number_1 = float(input("请输入x的取值"))
print("一阶导数代数运算后的结果为:{:.5f}".format(fun_1.subs(x,number_1)))
得到结果如下
3.三角函数求导
我们这里求导的海曙改为
输入x*sin(x)即可,求解一次导数
带入数值3
from sympy import *
x = symbols('x')
fun = eval(input("请输入函数"))
print("一阶求导")
fun_1 = diff(fun,x)
print(fun_1)
number_1 = float(input("请输入x的取值"))
print("一阶导数代数运算后的结果为:{:.5f}".format(fun_1.subs(x,number_1)))
运行结果如下图。
我们对其进行绘图
from sympy import *
import matplotlib.pyplot as plt
import pylab
import numpy as np
x_arr = []
y = []
y_1 = []
for ele in np.arange(-10,10,0.1):
x_arr.append(ele)
y.append(fun.subs(x,ele).evalf())
y_1.append(fun_1.subs(x,ele).evalf())
plt.plot(x_arr,y)
plt.plot(x_arr,y_1)
pylab.xlim(-10, 10)
plt.show()
得到如下图象
4.对数函数求导
通用使用手打的方式输入函数,主打就是一个自由
对数函数的输入,我们使用sympy带的函数包,由于我们将sympy已经全部导入了
直接使用log(a,b)就等同于
from sympy import *
x = symbols('x')
fun = eval(input("请输入函数"))
print("一阶求导")
fun_1 = diff(fun,x)
print(fun_1)
number_1 = float(input("请输入x的取值"))
print("一阶导数代数运算后的结果为:{:.5f}".format(fun_1.subs(x,number_1)))
我们求导
输入log(x,2)+1即可
x取值为1
得到结果如上午所示
5.反三角函数求导
我们假设求导函数为arcsinx
手敲 asin(x)
取x为0
from sympy import *
x = symbols('x')
fun = eval(input("请输入函数"))
print("一阶求导")
fun_1 = diff(fun,x)
print(fun_1)
number_1 = float(input("请输入x的取值"))
print("一阶导数代数运算后的结果为:{:.5f}".format(fun_1.subs(x,number_1)))
运行结果为
6.对函数求偏导
求导函数为
输入
3*x1**3+x1*x2**2 +x1**2*x2 +5*x1 +4*x2
x1,x2的取值分别为2,1
from sympy import *
x1 = symbols('x1')
x2 = symbols('x2')
fun = eval(input("请输入函数"))
print("对x1求偏导")
fun_1 = diff(fun,x1)
print(fun_1)
print("再对x2求偏导")
fun_2 = diff(fun_1,x2)
print(fun_2)
number_1 = float(input("请输入x1的取值"))
number_2 = float(input("请输入x2的取值"))
print("一阶导数代数运算后的结果为:{:.5f}".format(fun_2.subs({x1:number_1,x2:number_2})))
运行结果为