利用sympy对函数求导,并带值求计算结果
问题描述:
在写梯度下降法求最小值时,用pycharm写就一直报错
错误:raise TypeError(“Cannot convert expression to float”)
TypeError: Cannot convert expression to float
后面就直接用python自带的IDLE测试又发现可行,
from sympy import *
x = symbols('x')
f = 3*pow(x,2)-40*x-10
df = diff(f,x) #对x求导,获取的知识一个符号表达式
x1 = 100
eta = 0.1
x = x1 -eta*float(df.evalf(subs = {x:x1}))
就觉得很奇怪,想不明白,于是又重新运行了一遍,出现了同样的错误。
解决:
后面发现问题出在了x身上,原来是x被重复覆盖,在IDLE上的测试,x并未覆盖,当运行后
x = x1 -eta*float(df.evalf(subs = {x:x1})) ,再运行一次时,subs = {x:x1} x就改变了,就不是原来的了,所以我的源代码问题就出在这,所以只需要让程序知道哪个x是函数的自变量,哪个是x是需要带入的值。也不用folat转换了,yes!
from sympy import *
def function():
x = symbols('x')
f = 3 * pow(x, 2) - 40 * x - 10
df = diff(f,x) #对x求导
return df
eta = 0.1
x = 100
d = function()
# print(type(d))
# print(d.evalf(subs={'x':100}))
for _ in range(100):
x = x-eta*d.evalf(subs={'x':x})
print(x)
结果:
参考:python实现函数求导
PS:第一次使用sympy,多多指教>-<