Pregunta

He ecuación siguiente:

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

Es necesario crear una función que encuentra lam para N especificado.

En este momento lo estoy haciendo uso de bucle simple:

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

¿Cómo puedo resolverlo más precisa y sin el uso de bucles?

¿Fue útil?

Solución

Si usted tiene

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

entonces usted sabe que

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

Supongamos que para ampliar estos términos? Se unen en una sencilla ecuación cúbica, con coeficientes reales, igual a cero? ¿Hay una función que va a resolver por usted?

La respuesta es sí. Una solución podría ser el uso de fzero, pero dado que la ecuación es simplemente un polinomio cúbico, raíces es la respuesta a menos que necesitaba una solución simbólica. Utilice la caja de herramientas simbólica para los problemas simbólicos.

Otros consejos

Aquí es una solución para N = 10 por Wolfram Alpha:

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

Una solución algebraica de trabajo para su caso particular, porque no es terriblemente difícil. El problema es que, en general, las ecuaciones no lineales requieren una solución iterativa: comenzar con una suposición, paso en una dirección particular, y es de esperar converger a una solución. No se puede resolver ecuaciones no lineales, en general sin iteración y bucle.

Reordenar la ecuación para ser 0 = f(x)/g(x) (donde f y g son polinomios). Luego resuelve para 0 = f(x). Esto debe ser lo suficientemente fácil como f será cúbico ( http://en.wikipedia.org/wiki / Cubic_function # Roots_of_a_cubic_function ). De hecho, Matlab tiene la función roots() para hacer esto.

Trazado sugieren que para N positivo, hay exactamente una solución en el intervalo [-1,1). Usted debe considerar método de Newton , convergerá para una estimación inicial de cero con bastante rapidez.

Se puede resolver esta ecuación en forma cerrada, como se discute en otras respuestas, pero para ser honesto, soluciones de forma cerrada a los polinomios de grado> 2 no son muy útiles en la práctica, ya que los resultados tienden a estar mal acondicionado.

Para su polinomio en particular, estoy de acuerdo con Alexandre que el método de Newton es probablemente el camino a seguir.

A la larga, sin embargo, le recomiendo escribir (o la reutilización de Internet) una implementación del algoritmo de búsqueda de raíz Jenkins-Traub. Wikipedia lo describe como "prácticamente un estándar en recuadro negro polinómicas raíz buscadores," y no están exagerando. Ha servido todas mis necesidades de polinomios para resolver durante años; en mi experiencia es más robusto que el método de Newton (sin dependencia de una buena estimación inicial) y métodos basados ??en el valor propio, y es bastante rápido para arrancar.

Hay una solución algebraica a su problema para la mayoría de los valores de N. Aquí está la solución, según la resuelve 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í, es feo.

Si usted tiene uno, una solución exacta algebraica, incluso uno grande feo como éste, es siempre superior a una solución numérica. Como se indica duffymo, la solución de un problema con los métodos numéricos requieren iteraciones (por lo que es lento), y el solucionador pueden quedar atrapados en mínimos locales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top