Вопрос

У меня после уравнения:

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, решение проблемы с численными методами требуют итераций (так что это медленно), а решатель может застрять в локальных минимах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top