Почему нельзя сходиться по решению в Python? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть уравнение, которое я пытаюсь найти, где производная этого уравнения равна 1.

Я использую решение sympy и вычитаю 1 из уравнения, чтобы найти решение для 0, но оно никогда не сходится к решению, которое в этом случае должно быть x = 260.806 для f '(x) = 1.

Почему он не может найти это решение и что я могу изменить, не переписывая для чего-то, кроме sympy? Он не выдает ошибок, просто пытается бесконечно.

import sympy as sym
from sympy import symbol, symbols, solve, init_printing, diff, lambdify, exp
import matplotlib.pyplot as plt
import numpy as np

x_sym = symbols('x')
init_printing(use_unicode=True)
y_sym_orig = x_sym*exp(0.4*(1-x_sym/550))
y_sym_deriv = diff(y_sym_orig, x_sym, 1)
print('Orig=', y_sym_orig)
print('Deriv=', y_sym_deriv)

y_orig = sym.lambdify(x_sym, y_sym_orig)
y_deriv = sym.lambdify(x_sym, y_sym_deriv)

x_sol=solve(y_sym_deriv-1, x_sym)
print('The derivative has y=1 at: ',x_sol)

plt.figure()
x1 = np.arange(0, 300, .1)
y_graph = y_orig(x1)
y_deriv = y_deriv(x1)
plt.ylabel('y')
plt.xlabel('x')
plt.grid(True, which='both')
plt.ylim(0,1)
plt.plot(x1, y_graph, 'r', label='Original')
plt.plot(x1, y_deriv, 'b', label='Derivitive')
plt.title('Original and Derivitives')
plt.legend()
plt.show()

1 Ответ

0 голосов
/ 01 ноября 2018

SymPy сильно предпочитает рациональные числа числам с плавающей точкой. Добавьте from sympy import Rational и замените 0.4 на Rational('0.4') в формуле.

y_sym_orig = x_sym*exp(Rational('0.4')*(1-x_sym/550))
y_sym_deriv = diff(y_sym_orig, x_sym, 1)
x_sol = solve(y_sym_deriv-1, x_sym)
print('The derivative has y=1 at: ', x_sol)

печать

The derivative has y=1 at:  [-1375*LambertW(exp(3/5)) + 1375]

Примечания:

  • Rational(2, 5) - это еще один способ представления 2/5 в SymPy. Rational(0.4) или Rational(2/5) не помогли бы: обе версии сначала создают плавающий объект Python, рациональная форма которого не 2/5, а скорее 3602879701896397/9007199254740992.

  • Хорошая идея - распечатать уравнение перед его решением (как вы это сделали). Здесь формула для производной: -0.00108496341646638*x*exp(-0.000727272727272727*x) + 1.49182469764127*exp(-0.000727272727272727*x) в исходной форме и -x*exp(-x/1375 + 2/5)/1375 + exp(-x/1375 + 2/5) в рациональной форме. Решить уравнения символически , когда они заполнены числами с плавающей точкой , является сложной или невыполнимой задачей, учитывая, насколько арифметика с плавающей запятой отличается от правил символической математики.

  • Подробнее см. Номера Python против номеров SymPy .
...