Question

Je l'équation suivante:

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

Je dois créer une fonction qui trouve lam pour N spécifié.

En ce moment je fais en utilisant simple boucle:

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

Comment puis-je résoudre plus précis et sans utiliser des boucles?

Était-ce utile?

La solution

Si vous avez

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

alors vous savez que

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

Supposons que vous deviez développer ces termes? Coalesce dans une équation simple cube, avec des coefficients réels, égal à zéro? Y at-il une fonction qui va le résoudre pour vous?

La réponse est oui. Une solution pourrait consister à utiliser fzero, mais étant donné que l'équation est juste un polynôme cubique, racines est la réponse à moins que vous besoin d'une solution symbolique. Utilisez la boîte à outils symbolique pour des problèmes symboliques.

Autres conseils

Voici une solution pour N = 10 par Wolfram Alpha:

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

Une solution algébrique fonctionnera pour votre cas particulier, car il est pas très difficile. Le problème est que, en général, les équations non linéaires nécessitent une solution itérative: commencer par une proposition, l'étape dans une direction particulière, et nous l'espérons converger vers une solution. Vous ne pouvez pas résoudre des équations non linéaires en général sans itération et en boucle.

réarranger l'équation à 0 = f(x)/g(x) (où f et g sont des polynômes). Ensuite, pour résoudre 0 = f(x). Cela devrait être assez facile que f sera cube ( http://en.wikipedia.org/wiki / Cubic_function # Roots_of_a_cubic_function ). En fait, Matlab a la fonction roots() de le faire.

Traçage suggèrent que pour le positif N, il y a exactement une solution dans l'intervalle [-1,1). Vous devriez considérer méthode de Newton, il convergera une assez rapidement estimation initiale de zéro.

Vous pouvez résoudre cette équation sous forme fermée, tel que discuté dans d'autres réponses, mais pour être honnête, des solutions de forme fermée à polynômes de degré> 2 ne sont pas très utiles dans la pratique, car les résultats ont tendance à être mal conditionné.

Pour votre polynôme particulier, je suis d'accord avec Alexandre que la méthode de Newton est probablement la voie à suivre.

À long terme, cependant, je vous recommande vivement d'écrire (ou la réutilisation de l'Internet) une implémentation de l'algorithme de racine trouver Jenkins-Traub. Wikipedia décrit comme « pratiquement une norme dans la racine viseurs polynôme boîte noire », et ils ne sont pas exagérer. Il a servi tous mes besoins de polynôme de résolution des années; dans mon expérience, il est plus robuste que la méthode de Newton (pas de dépendance à l'égard d'une bonne estimation initiale) et les méthodes basées sur des valeurs propres, et est assez rapide pour démarrer.

Il existe une solution algébrique à votre problème pour la plupart des valeurs de N. Voici la solution, comme résolu par 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))

Oui, il est laid.

Si vous avez une, une solution algébrique exacte, même un grand laid comme celui-ci, est toujours supérieure à une solution numérique. Comme duffymo indiqué, la résolution d'un problème avec les méthodes numériques nécessitent des itérations (il est donc lent), et le solveur peut se coincer dans des minima locaux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top