在 Python 中使用 Sympy 评估符号微分



我正在使用Sympy库在python中编码NewtonRaphson算法,这是我的算法实现:

def NewtonRaphson(fx,p0,tolerancia,iteracionesMaximas):
    print
    fx = S(fx)
    x = Symbol('x')
    i = 1
    p = 0.0
    while i<= iteracionesMaximas:
        
        y = fx.subs(x,p0)
        yy = diff(fx,x).subs(x,p0)
        p = p0 - (y/yy)
        if absolute(p-p0) < tolerancia:
            print "Se encontró la raíz y={raiz} luego de {n} iteraciones".format(raiz=p, n=i-1)
            return
        i += 1
        print "{i}t{p}t{p0}".format(i=i-1,p=p,p0=p0)
        p = p0
    print "El método falló luego de {i} iteraciones".format(i=i-1)

我正在获得带有以下消息的加薪:

line 18, in NewtonRaphson    
    yy = diff(fx,x).subs(x,p0)    
  File "/usr/local/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 984, in diff    
    if n < 0:    
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/relational.py", line 226, in __nonzero__    
    raise TypeError("symbolic boolean expression has no truth value.")    
TypeError: symbolic boolean expression has no truth value.    

我调用函数fx等于 'x**3-x-1' 的字符串并输入调用NewtonRaphson(fx,1.7,10**(-4),17)

我做错了什么?

看起来您正在将符号表达式传递给 numpy 的绝对函数。从您的代码来看,我敢打赌您的导入语句是

from pylab import *
from sympy import *

如果是这种情况,您应该将absolute替换为 Abs,以便您使用 sympy 内置的绝对值函数,而不是用于 numpy 数组

的函数。

此外,您需要将p = p0替换为p0 = p才能使算法正常运行。

这是一个工作版本,导入语句有所更改。我还删除了一些不必要的陈述。

import sympy as sy
x = sy.symbols('x')
fx = x**3 - x - 1
def NewtonRaphson(fx,p0,tolerancia,iteracionesMaximas):
    for i in xrange(iteracionesMaximas):
        y = fx.subs(x, p0)
        yy = sy.diff(fx,x).subs(x, p0)
        p = p0 - (y / yy)
        if sy.Abs(p-p0) < tolerancia:
            print "Se encontró la raíz y={raiz} luego de {n} iteraciones".format(raiz=p, n=i-1)
            return
        print "{i}t{p}t{p0}".format(i=i+1,p=p,p0=p0)
        p0 = p
    print "El método falló luego de {i} iteraciones".format(i=i-1)
NewtonRaphson(fx,1.7,10**(-4),17)

最新更新