modo più semplice per trovare una soluzione dell'equazione
-
01-10-2019 - |
Domanda
Ho seguente equazione:
f(N): N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2));
Ho bisogno di creare una funzione che reperti lam
per N
specificato.
In questo momento sto facendo con semplice ciclo:
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
Come posso risolverlo più preciso e senza l'utilizzo di loop?
Soluzione
Se hai
N = ((1+lam)^3 )/ ((1-lam)*(1+lam^2))
poi si sa che
(1+lam)^3 = N*(1-lam)*(1+lam^2)
Supponiamo che si dovesse espandere queste condizioni? Fondersi in una semplice equazione cubica, con coefficienti reali, uguale a zero? C'è una funzione che risolverà per voi?
La risposta è sì. Una soluzione potrebbe essere quella di utilizzare fzero, ma dal momento che l'equazione è solo un polinomio cubico, radici è la risposta a meno che non avete bisogno di una soluzione simbolica. Utilizzare la casella degli strumenti simbolico per problemi simbolici.
Altri suggerimenti
Ecco una soluzione per N = 10 per Wolfram Alpha:
http://www.wolframalpha.com/input/?i=(1%2Bx^3)/((1-x)*(1%2Bx^2))%3D10
Una soluzione algebrica lavorerà per il vostro caso particolare, perché non è terribilmente difficile. Il problema è che, in generale, equazioni non lineari richiedono una soluzione iterativa: iniziare con una supposizione, passo in una particolare direzione, e auspicabilmente convergere ad una soluzione. Non si può risolvere equazioni non lineari, in generale, senza iterazione e loop.
Riposizionare l'equazione sia 0 = f(x)/g(x)
(dove f
e g
sono polinomi). Poi risolvere per 0 = f(x)
. Questo dovrebbe essere abbastanza facile come f
sarà cubo ( http://en.wikipedia.org/wiki / Cubic_function # Roots_of_a_cubic_function ). In realtà, Matlab ha la funzione roots()
per fare questo.
plottaggio suggeriscono che per N positiva, v'è esattamente una soluzione nell'intervallo [-1,1). Si dovrebbe considerare di Newton metodo , si convergerà per un tentativo iniziale pari a zero abbastanza rapidamente.
È possibile risolvere questa equazione in forma chiusa, come discusso in altre risposte, ma per essere onesti, soluzioni in forma chiusa a polinomi di grado> 2 non sono molto utile nella pratica, perché i risultati tendono ad essere scarsamente condizionata.
Per la vostra particolare polinomiale, sono d'accordo con Alexandre che il metodo di Newton è probabilmente la strada da percorrere.
Nel lungo periodo, però, mi raccomando a scrivere (o riutilizzo da Internet) un'implementazione dell'algoritmo radice conoscitiva Jenkins-Traub. Wikipedia descrive come "praticamente uno standard nel black-box polinomio di root-cercatori", e non stiamo esagerando. Ha servito tutti i miei bisogni polinomiali-solving per anni; nella mia esperienza è più robusto di metodo di Newton (senza affidamento su una buona congettura iniziale) e metodi di autovalori-based, ed è abbastanza veloce per l'avvio.
C'è una soluzione algebrica al vostro problema per la maggior parte dei valori di N. Ecco la soluzione, come risolto da 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))
Sì, è brutto.
Se si dispone di uno, una soluzione esatta algebrica, anche un grande brutto come questo, è sempre superiore ad una soluzione numerica. Come duffymo indicato, la soluzione di un problema con metodi numerici richiedono iterazioni (quindi è lento), e il risolutore può rimanere bloccato in minimi locali.