2014-02-08 3 views
1

Я codig NewtonRaphson алгоритм в Python с использованием библиотеки SymPy, это моя реализация алгоритма:Оценка символической дифференциации с SymPy в Python

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) 

я получить рейз Wich следующее сообщение:

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).

В чем я ошибаюсь?

+0

Показать весь трафик. – user2357112

+0

Какова ценность 'fx'? – user2357112

+0

Я называю x как '' x ** 3-x-1'' – diegoaguilar

ответ

1

Похоже, вы передаете символическое выражение абсолютной функции 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) 
Смежные вопросы