ищет численное решение уравнения - PullRequest
1 голос
/ 08 февраля 2020

Я решал несколько уравнений и пришел к упрощенной версии ниже:

import sympy as sp
Diff = sp.Symbol('Diff')
eq1 = 0.0363984561703043*Diff**(-0.333333333333333)*(0.01 - 1.288e-18*(2.576e-18*Diff - 2.79999921278e-7)**(-0.5)) + 0.0363984561703043*Diff**(-0.333333333333333)*(17857.1428571429*(2.576e-18*Diff - 2.79999921278e-7)**0.5 - 434782608695.652) + 1299.94486322516*Diff**0.666666666666667
ans = sp.solve(eq1 - 1, Diff)
print(ans)

Мне нужна помощь, чтобы найти символ (разность)? Я пробовал solve() и nsolve(), но это не дало решения с сообщением:

'ValueError: Не удалось найти root в пределах данного допуска. (0.00104637107257089658395> 2.16840434497100886801e-19) Попробуйте другую начальную точку или настройте аргументы. '

1 Ответ

2 голосов
/ 09 февраля 2020

Во-первых, давайте попробуем построить вашу функцию (мне приходилось увеличивать пределы оси x несколько раз, пока я наконец не нашел нечто, похожее на root):

eq = sp.Abs(eq1 - 1)
xs = np.linspace(-1e6, 2e7, 100)
ys = [eq.evalf(subs={Diff: x}) for x in xs]
plt.plot(xs, ys)
plt.hlines(0, -1e6, 2e7)

plot(abs)

ОК, поэтому, если будет root, он должен находиться где-то в районе 1,0-1,5 * 10 ^ 7. Теперь посмотрите на мнимую часть вашего уравнения в этой области:

eq = sp.im(eq1 - 1)
xs = np.linspace(1e7, 1.5e7, 100)
ys = [eq.evalf(subs={Diff: x}) for x in xs]
plt.plot(xs, ys)
plt.hlines(0, 1e7, 1.5e7)

plot(im)

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

sp.nsolve(sp.re(eq1 - 1), Diff, 1e7)
> 12173913.2204420

eq1.subs(Diff, 12173913.2204420).evalf()
0.999999925494194 + 0.00149499418051858*I
...