Проще способ найти решение уравнения
-
01-10-2019 - |
Вопрос
У меня после уравнения:
f(N): N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2));
Мне нужно создать функцию, которая находит lam
для указания N
.
Прямо сейчас я делаю это, используя простую петлю:
lam = 0.9999;
n = f(lam);
pow = 0;
delta = 0.1;
while(abs(N - n)) > 0.1 & pow < 10000)
lam = lam - 0.001;
n = f(lam)
pow = pow+1;
end
Как я могу решить его более точным и без использования петель?
Решение
Если у тебя есть
N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2))
тогда вы знаете, что
(1+lam)^3 = N*(1-lam)*(1+lam^2)
Предположим, вы должны были расширить эти условия? Coalesce в одно простое кубическое уравнение, с реальными коэффициентами, равными нулю? Есть ли функция, которая решит это для вас?
Ответ да. Одно решение может быть использовано FZERO, но поскольку уравнение - это просто кубический полиномиальный, корни - это ответ, если вам не нужно символическое решение. Используйте символическую панель инструментов для символических проблем.
Другие советы
Вот решение для N = 10 на Wolfram Alpha:
http://www.wolframalpha.com/input/?i=(1%2Bx^3)/((1-x)*(1%2Bx^2))%3D10
Алгебраическое решение будет работать для вашего конкретного случая, потому что это не ужасно сложно. Проблема в том, что, как правило, нелинейные уравнения требуют итеративного решения: начните с предположения, шага в определенном направлении и, надеюсь, сходятся к решению. Вы не можете решить нелинейные уравнения в целом без Итерация и петля.
Переставить уравнение, чтобы быть 0 = f(x)/g(x)
(куда f
а также g
полиномы). Затем решить 0 = f(x)
. Отказ Это должно быть достаточно легко, как f
будет кубический (http://en.wikipedia.org/wiki/cubic_function#Roots_of_a_cubic_function). На самом деле, Matlab имеет roots()
Функция сделать это.
Построение предполагает, что для n положительного, в интервале имеется одно решение [-1,1). Вы должны рассмотреть Метод Ньютона, он будет сходиться на нулевой первоначальный догадок довольно быстро.
Вы можете решить это уравнение в закрытой форме, как обсуждалось в других ответах, но, честно говоря, замкнутые решения для полиномов степени> 2 не очень полезны на практике, потому что результаты, как правило, плохо обусловлены.
Для вашего определенного многочлена я согласен с Александром, что метод Ньютона, вероятно, путь.
В конечном итоге, хотя я настоятельно рекомендую написать (или повторно использовать из Интернета) реализацию алгоритма root-нахождения jenkins-Traub. Wikipedia описывает его как «практически стандарт в черных полиномиальных корневых искателях», и они не преувеличивают. Он служил всем моим потребностям в полиномиальных потребностях в течение многих лет; По моему опыту это более прочный, чем метод Ньютона (не зависимость от хороших первоначальных угасов) и на собственных методах на основе собственного значения, и довольно быстро загружается.
Существует алгебраическое решение для вашей проблемы для большинства значений N. Вот решение, как решено вольфрам Альфа:
if N+1!=0
x = (20 N^3+18 N^2+3 sqrt(3) sqrt(16 N^6+32 N^5-20 N^4-72 N^3-9 N^2+54 N+27)-27 N-27)^(1/3)/(3 2^(1/3) (N+1))-(2^(1/3) (2 N^2+3 N))/(3 (N+1) (20 N^3+18 N^2+3 sqrt(3) sqrt(16 N^6+32 N^5-20 N^4-72 N^3-9 N^2+54 N+27)-27 N-27)^(1/3))+N/(3 (N+1))
Да, это уродливо.
Если у вас есть один, точное алгебраическое решение, даже большое уродливое подобное, всегда превосходит численное решение. Как указано Duffymo, решение проблемы с численными методами требуют итераций (так что это медленно), а решатель может застрять в локальных минимах.