求函数极小值点的代码
所求函数如下:
C
(
n
)
=
1250
(
2
−
e
−
(
n
−
5000
)
2
)
C(n)=1250(2-e^{-(n-5000)^2})
C(n)=1250(2−e−(n−5000)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