2017-01-22 2 views
-3

Я пытаюсь найти корни уравнения, используя метод Ньютона. Вероятно, это очень очевидная ошибка, но я все время получаю сообщение об ошибке: «TypeError: невозможно определить значение истинности Relational». Есть что-то, что я забыл импортировать/включить? Извините, я очень новичок в python.Newtons Метод определяемой пользователем функции

import sympy 

from sympy import * 
x, y, z = symbols('x y z') 
init_printing(use_unicode=True) 

def newton(f, n, eps): 
    y = f(n) 
    delta = diff(eps, x) 
    while abs(y) > eps: 
     dy = (f(n + delta) - y)/delta 
     n = n - y/dy 
     y = f(n) 
    return n 

def f(n): 
    return 5 * n + 10 

eps = input("input function:") 

print(newton(f, 0, eps)) 
+2

Обратите внимание, что если ваш вопрос хорош и о основах python, не нужно называть его «срочным».Вы получите 7 ответов в 45 наносекундах со всеми людьми, голодающими на хорошие вопросы в этот воскресный вечер :) –

+0

Итак, вы говорите, что это то, что у вас есть до сих пор, но есть ли проблемы с этим? Это вызывает ошибки? Не дает ли он правильных результатов? – ayhan

+0

Я вижу, что 'print (newtroot (function, t))' не передает 3 параметра выше и передает 'function' вместо' f'. А что такое функция, отлитая как целое ??? –

ответ

1

Ваш код не реализует метод Ньютона. Вы хотите оценить касательную линию при первоначальном предположении, перехватите ее с y = 0, чтобы получить новое предположение и продолжайте делать это, пока функция в значении предположения не станет достаточно близка к 0. См. Код ниже.

def newton(f, x, eps=1e-50): 
    y = f(x) 
    delta = 1e-10 
    while abs(y) > eps: 
     dy = (f(x+delta) - y)/delta 
     x = x - y/dy 
     y = f(x) 
    return x 

def f(x): 
    return 5 * x + 10 

newton(f, 0) # outputs -2.0 

Предоставляемые пользователем функции с помощью текста нелегки. Обычно мы выполняем численную реализацию функции, как указано выше.

Если вы хотите работать на символическом уровне, вам нужно проанализировать строку и построить подходящую функцию в вашем коде, что на самом деле не тривиально. Вы можете проверить, доступны ли библиотеки для этого.

На практике вы, вероятно, захотите реализовать максимальное количество итераций в случае, если кто-то запускает его по функции без корня.

+0

Большое вам спасибо! Для пользовательской функции было бы разумной идеей использовать Sympy и, возможно, diff (func, var)? –

+0

Да, симпы могут быть хороши для разбора. Я бы не сделал символической дифференциации. Вероятно, нет заметной выгоды, и она довольно медленная по сравнению с вычислением dy, как указано выше. –

+0

Обычно вы можете использовать sympy для поиска корня аналитически; точкой метода Ньютона является быстрый поиск корней. :) –

1

Реферат: Пользовательская функция может быть сформулирована в SymPy, производные которой могут быть получены почти автоматически, а числовые функции для целевой функции и ее производных могут быть получены lambdify. Используя функцию lambdify ed Python, вы не торгуете эффективностью из-за символической оценки. Кроме того, мы можем использовать пакет оптимизации SciPy, который содержит метод Ньютона.

scipy.optimize.minimize предлагает метод Ньютона. Вы можете накормить его своей целевой функцией и ее производным и получить результат.

Использование символической математики в вашем исходном коде для меня не имеет смысла, поскольку оно касается конкретной математической формулы. Используйте NumPy, и вы получите лучшую производительность исполнения.

Если вы хотите предложить общий математический интерфейс для различных математических формул, SymPy отлично, потому что мы можем наслаждаться его производными функциональными возможностями.

Несколько месяцев назад я играл с комбинацией SymPy и SciPy, чтобы сделать физическую модель пружинных тел.

https://github.com/wakita/symdoc/blob/master/kk.ipynb

  • Формула целевой функции приведено в работе [9].
  • Функция Python, соответствующая целевой функции, получена в In [10].
  • Производные целевой функции получены в работе [14].
  • Минимизация на основе Ньютона выполняется в [19]. Он использует производные первого и второго порядка целевой функции.

Красота использования SymPy заключается в том, что, как вы видите в моем примере, я не разбираюсь в сложном вычислении производных вообще и для другого, решение имеет дело с любой формулой, выраженной в SymPy.

Смежные вопросы