Frage

Ich habe folgende Gleichung:

f(N):  N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2));

Ich brauche eine Funktion zu erstellen, die Funde für bestimmte lam N.

Im Moment mache ich es mit einfacher Schleife:

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

Wie kann ich löse es genauer und ohne Loops?

War es hilfreich?

Lösung

Wenn Sie

N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2))

, dann wissen Sie, dass

(1+lam)^3 = N*(1-lam)*(1+lam^2)

Angenommen, Sie diese Begriffe erweitern sind? Coalesce in einer einfachen kubischen Gleichung, mit reellen Koeffizienten gleich Null? Gibt es eine Funktion, die es für Sie lösen?

Die Antwort ist ja. Eine Lösung könnte sein fzero zu verwenden, aber da die Gleichung nur ein kubisches Polynom ist, Wurzeln ist die Antwort, wenn Sie eine symbolische Lösung benötigt. Verwenden Sie die symbolische Toolbox für symbolische Probleme.

Andere Tipps

Hier ist eine Lösung für N = 10 von Wolfram Alpha:

http://www.wolframalpha.com/input/?i=(1%2Bx^3)/((1-x)*(1%2Bx^2))%3D10

Eine algebraische Lösung für Ihren speziellen Fall arbeiten, weil es nicht sehr schwierig ist. Das Problem besteht darin, dass im allgemeinen, nicht-lineare Gleichungen eine iterative Lösung erfordern: mit einer Vermutung, Schritt in einer bestimmten Richtung starten, und hoffentlich zu einer Lösung konvergieren. Sie können keine nicht-lineare Gleichungen in der Regel lösen ohne Iteration und Looping.

Rearrange die Gleichung sein 0 = f(x)/g(x) (wobei f und g Polynome sind). Dann gilt für 0 = f(x) lösen. Dies sollte leicht genug sein, wie f kubische sein ( http://en.wikipedia.org/wiki / Cubic_function # Roots_of_a_cubic_function ). In der Tat hat Matlab die roots() Funktion, dies zu tun.

Plotten deuten darauf hin, dass für N positiv ist, gibt es genau eine Lösung im Intervall [-1,1). Sie sollten sich überlegen Newton-Verfahren , es für eine Null anfängliche Schätzung ziemlich schnell konvergieren.

Sie können diese Gleichung lösen in geschlossener Form, wie in anderen Antworten diskutiert, aber ehrlich, geschlossene Form Lösungen für Polynome vom Grad sein> 2 sind nicht sehr nützlich in der Praxis, weil die Ergebnisse sind in der Regel schlecht konditioniert werden.

Für Ihr spezielles Polynom, ich stimme mit Alexandre, dass die Newton-Verfahren ist wahrscheinlich der Weg zu gehen.

Auf lange Sicht, aber ich sehr empfehlen kann schriftlich (oder aus dem Internet wiederverwendet) eine Implementierung der Jenkins-Traub Wurzelfindungsalgorithmus. Wikipedia beschreibt es als „praktisch ein Standard in der Black-Box-Polynom root-Finders,“ und sie sind nicht übertrieben. Es hat alle meine Polynom-Lösung muss für Jahre gedient; in meiner Erfahrung ist es robuster als das Newton-Verfahren (kein Vertrauen auf eine gute erste Schätzung) und Eigenwert-basierten Methoden, und ist recht schnell zu booten.

Es ist eine algebraische Lösung für Ihr Problem für die meisten Werte von N. Hier ist die Lösung, gelöst, wie sie von Wolfram Alpha

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))

Ja, es ist hässlich.

Wenn Sie eine haben, eine exakte algebraische Lösung, auch eine große hässliche wie dieser, ist immer besser als eine numerische Lösung. Wie duffymo angegeben ist, ein Problem zu lösen mit numerischen Methoden Iterationen erfordern (so es langsam ist), und der Solver kann in lokalen Minima stecken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top