Почему SymPy не находит решения для моего уравнения? - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу вычислить корни моих графиков, которые я построил (через matplotlib).

Я пробовал с SciPy, но ему нужна грубая оценка координат корней, что слишком непрактично. Сейчас я пробую это с SymPy, но он не может найти решение и печатает пустые скобки. Я делаю что-то не так?

Вот мой код:

import matplotlib as plt
import numpy as np
from sympy import *

h = 1.8
alpha = 0
g = 9.81
K = 0.0004
v_0 = 360


x = np.linspace(0, 10000, 500)
f_x = h + x * np.tan(alpha) - (g / (2 * (K ** 2) * (v_0 ** 2))) * ((np.e ** (K * x) - 1) ** 2)

*bunch of labels and titles*

x = Symbols("x")
roots = solve(f_x, x)
print(roots)

Переменные формулы все определены, кроме, конечно, х.

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

1 Ответ

0 голосов
/ 18 апреля 2020

Если вы исследуете свое уравнение символически, вы обнаружите, что вы можете легко найти два корня этого уравнения для значений, которые вы выбрали. Значение альфа, равное 0, заставляет уравнение выглядеть так: 1.8 - 236.55*(exp(0.0004*x) - 1)**2.

>>> from sympy import exp, tan
>>> from sympy.abc import x, a
>>> h = 1.8
>>> alpha = a
>>> g = 9.81
>>> K = 0.0004
>>> v_0 = 360
>>> f_x = h+x*tan(alpha)-(g/(2*(K**2)*(v_0**2)))*((exp(K*x)-1)**2)
>>> solve(f_x.subs(a, alpha), x)

Это очень важная отправная точка при работе с нелинейными уравнениями, потому что, если вы можете найти решения в некоторой точке, вы часто можете найти решение в соседней точке. В вашем случае близлежащая точка будет альфа слегка положительной или отрицательной. И такое уравнение для произвольной альфы может быть решено только как неявная функция (т.е. численно). Но поскольку у вас есть ранее известное значение, вы можете использовать , что , в качестве первоначального предположения для решателя.

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

>>> branches = [exp(K*x) - s for s in solve(f_x, exp(K*x))]

, а затем решаете каждую из этих ветвей с ненулевым значением альфа, то поведение будет намного лучше: например, nsolve(branch[0].subs(a, new alpha value), value from when alpha was 0).

Это основная идея. Напомним:

  1. не используйте numpy при поиске символов c ответов
  2. при работе с нелинейными уравнениями, посмотрите, можете ли вы сделать некоторый связанный с x термин равным нулю ( альфа = 0 в вашем случае), так что вы можете решить остальную часть уравнения для х; используйте это значение, когда допускается, чтобы нулевой член имел ненулевое значение (ненулевой альфа) * ​​1020 *
  3. при условии f (x) + g (x) = 0, который плохо себя ведет вблизи root, попробуйте работать с x = f^-1(g(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...