DataWhale学习笔记-TASK1_高等数学

求函数极小值点的代码

所求函数如下:
C ( n ) = 1250 ( 2 − e − ( n − 5000 ) 2 ) C(n)=1250(2-e^{-(n-5000)^2}) C(n)=1250(2e(n5000)2)

from sympy import *
## 求函数的极小值点
n = symbols('n')
y = 1250*(2-exp(-(n-5000)**2))
# 求导数
func1 = diff(y,n)
print(func1)
# 计算驻点
stag = solve(func1, n)
print("该函数驻点为{}".format(stag))
# 计算二阶导数
func2 = diff(y, n, 2)
# 计算驻点的二阶导数值,验证正负
# a1 = func2.evalf(subs = {n:stag[0]})
a1 = func2.subs(n,stag[0]).evalf()
print(a1)
print(a1 > 0)
# 函数的极小值
# print(y.evalf(subs = {n:5000}))
print(y.subs(n,5000).evalf())

代码逐行理解:

# n为符号变量
n = symbols('n')
#所定义函数
y = 1250*(2-exp(-(n-5000)**2))

sympy.diff()函数

diff(func,x,n)
其中,func是要求导的函数,x是要对其求导的变量,n是可选的,表示求n阶导数,默认为1阶导数。

例子1(求一阶导数)

注意,在用diff进行求导之前,需要用symbols函数定义变量

from sympy import diff
from sympy import symbols
def func(x):
    return x**4
x = symbols("x")
print(diff(func(x),x))

输出结果为:4*x**3

例子2(求多阶导数)

from sympy import diff
from sympy import symbols
def func(x):
    return x**4
x = symbols("x")
print(diff(func(x),x,2))

输出结果为:12*x**2

from sympy import diff
from sympy import symbols
def func(x):
    return x**4
x = symbols("x")
print(diff(func(x),x,3))

输出结果为:24*x

例子3(对多变量函数求偏导)

from sympy import diff
from sympy import symbols
def func(x,y):
    return x**4+y**3
x,y = symbols("x,y")
print(diff(func(x,y),x))

输出结果为:4*x**3

例子4(将导数带入具体的值求某一点处的导数)

from sympy import diff
from sympy import symbols
def func(x):
    return x**4
x = symbols("x")
print(diff(func(x),x).subs(x,2))   # 表示将x = 2,带入导函数4*x**3中

输出结果为32

sympy.solve()函数

sympy.solve() 函数来解单一方程的调用方式可以表示为 sympy.solve(表达式,符号) 。下面的代码演示了怎样解exp ⁡ ( x ) − 3 = 0 这个方程。

from sympy import *
d = symbols("d")
b = solve(exp(d)-3,d)
print(b)

输出结果为[log(3)],注意输出格式为list列表

如下面的代码所示,我们尝试解  x + exp ⁡ ( x ) + sin ⁡ ( x ) − 10 = 0 这个方程。

from sympy import *
d = symbols("d")
b = solve(d+exp(d)+sin(d)-10,d)
print(b)

结果是报错,没有算法来解这个方程,换种说法就是不能得到解析解。我们可以用数值计算函数 sympy.nsolve() 来近似计算的到数值解。具体用法如下:

from sympy import *
d = symbols("d")
b = nsolve(d+exp(d)+sin(d)-10,0)
print(b)

输出结果为1.96200120343440

在用Python的 sympy 库函数来解方程时会遇到以上两个问题,总体来说 sympy.solve() 函数能得到精确表达式,但是能解的方程有限;而 sympy.nsolve() 适用范围较广,但是只能得到近似解。

sympy.evalf()函数

sympy.evalf()函数可以用求出表达式的浮点数。

from sympy import *
a = symbols('a')  # 首先声明变量   subs 可以替换变量
x1 = (1/a).evalf(subs={a: 3.0},n=21)
x2 = (1/a).subs({a: 3}).evalf(n=6)
print(x1)
print(x2)

输出结果为:

0.333333333333333333333
0.333333

sympy.subs()函数

用法: math_expression.subs(variable, substitute)
参数:
variable –它是将被替换的变量或表达式。
substitute –它是替代变量或表达式或值。
返回值:返回替换后的表达式。

例子1

在此示例中,我们可以看到,通过使用**sympy.subs()**方法,可以在将变量或表达式替换为其他变量。

# import sympy
from sympy import *

x, y = symbols('x y')
exp = x ** 2 + 1
print("Before Substitution : {}".format(exp))

# Use sympy.subs() method
res_exp = exp.subs(x, y)

print("After Substitution : {}".format(res_exp))

输出结果为:

Before Substitution : x**2 + 1
After Substitution : y**2 + 1

例子2

在此示例中,我们看到,如果替换值为数字,则**sympy.subs()**返回所得表达式的解。

# import sympy
from sympy import *

x = symbols('x')
exp = cos(x) + 7
print("Before Substitution : {}".format(exp))

# Use sympy.subs() method
res_exp = exp.subs(x, 0)

print("After Substitution : {}".format(res_exp))

输出结果为:

Before Substitution : cos(x) + 7
After Substitution : 8

例子3

在此示例中,我们看到,如果将(旧的,新的)对的列表传递给子对象,则可以进行多次替换。

# import sympy
from sympy import *

x, y, z = symbols('x y z')
exp = x ** 2 + 7 * y + z
print("Before Substitution : {}".format(exp))

# Use sympy.subs() method
res_exp = exp.subs([(x, 2), (y, 4), (z, 1)])

print("After Substitution : {}".format(res_exp))

输出结果为:

Before Substitution : x**2 + 7*y + z
After Substitution : 33
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值