Если вы исследуете свое уравнение символически, вы обнаружите, что вы можете легко найти два корня этого уравнения для значений, которые вы выбрали. Значение альфа, равное 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)
.
Это основная идея. Напомним:
- не используйте numpy при поиске символов c ответов
- при работе с нелинейными уравнениями, посмотрите, можете ли вы сделать некоторый связанный с x термин равным нулю ( альфа = 0 в вашем случае), так что вы можете решить остальную часть уравнения для х; используйте это значение, когда допускается, чтобы нулевой член имел ненулевое значение (ненулевой альфа) * 1020 *
- при условии f (x) + g (x) = 0, который плохо себя ведет вблизи root, попробуйте работать с
x = f^-1(g(x))