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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top