使用numpy和sympy在python中进行编程,而我尝试在代码中使用派生类的尝试也陷入僵局。我经常得到
“ TypeError:'Add'对象不可调用”
和
“ ValueError:第一个变量不能为数字:1”。
这是一个用于定义牛顿方法以解决寻根问题的程序。我使用的样本方程式是1 / x + log(x)-2。我之所以这样说是因为我也遇到了numpy的log函数的一些问题。我认为我的问题与我使用的diff有关,因为我不确定如何使用它来返回实际值,而我阅读的文献也无济于事。
def newton(p0, f, n, t):
global p
p = 0
for i in range(1, n+1):
p = p0 - f(p0)/diff(f(x),p0)
if abs(p-p0) < t:
return p
p0 = p
i = i + 1
return f"The method failed after {n} iterations. The procedure was unsuccessful."
print(newton(p0=1, f=1/x+log(x)-2, n=10, t=5e-324))
我至少期望有一个数字,但是我遇到了上面描述的错误。
答案 0 :(得分:0)
您的代码中有两个问题,
第一个是函数中的参数f
应该有一个“函数”输入,表示f=lambda x: 1/x+log(x)-2
,
第二个是p = p0 - f(p0)/diff(f(x),p0)
。如果我理解正确,您会期望diff
函数作为派生函数执行,但是事实并非如此。也许您可以定义自己的推导函数:
def df(f, x):
h = 1e-5
return (f(x+h)-f(x))/h
然后您可以写p = p0 - f(p0)/df(f, p0)
因此整个代码可以编写如下:
def newton(p0, f, n, t):
global p
p = 0
for i in range(1, n+1):
def df(f, x):
h = 1e-5
return (f(x+h)-f(x))/h
p = p0 - f(p0)/df(f, p0)
if abs(p-p0) < t:
return p
p0 = p
i = i + 1
return f"The method failed after {n} iterations. The procedure was unsuccessful."
print(newton(p0=1, f=lambda x: 1/x+log(x)-2, n=10, t=5e-324))