Encuentra la raíz de una función cúbica.

Aquí está la cosa. Estoy tratando de usar la función fsolve en Python para encontrar la raíz de una función cúbica. Esta función cúbica tiene un parámetro, deltaW . Lo que hago es cambiar este parámetro deltaW de -50 a 50 , y encontrar la raíz de la función cúbica al mismo tiempo. A continuación se muestra mi guión:

 from scipy.optimize import fsolve import matplotlib.pyplot as plt import numpy as np import pylab g = 5.61 gamma = 6.45 kappa = 6.45 J = 6.45 rs = 1.0 #There are just parameters m = 5.0*10**(-11) wm = 2*3.14*23.4 X = [] X1 = [] def func(x): #Define the cubic function I need to solve A = 1j*g**2*(kappa + 1j*deltaW)*x*x/(m*wm**2) B = J**2 + (1j*deltaW - gamma)*(1j*deltaW + kappa) C = A + B D = abs(C)*x - J*np.sqrt(2*kappa)*rs return D for deltaW in np.linspace(-50, 50, 1000): x0 = fsolve(func, 0.0001) X.append(x0) deltaW = np.linspace(-50, 50, 1000) plt.plot(deltaW, X) plt.show() 

Cuando ejecuto este script, recibo estos dos mensajes:

  RuntimeWarning: The iteration is not making good progress, as measured by the improvement from the last five Jacobian evaluations. warnings.warn(msg, RuntimeWarning) /usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py:152: RuntimeWarning: The iteration is not making good progress, as measured by the improvement from the last ten iterations. warnings.warn(msg, RuntimeWarning) 

Lo siento, no tengo suficiente reputación para poner el argumento de este script aquí. Mi pregunta es por qué recibo este mensaje y por qué mi ttwig se ve tan rara en la parte izquierda.

¿Es porque mi código está mal?

    Como en casi todos los casos de encontrar raíces, una buena suposición inicial es imperativa. A veces, la mejor conjetura inicial es, de hecho, se sabe que es incorrecta. Ese es el caso aquí. El comportamiento de su secuencia de comandos, que muestra “picos” inesperados en la respuesta, puede observarse más a fondo al trazar la función y al trazar las raíces encontradas alrededor de esos picos (hey, tiene una consola Python – esto es muy facil).
    Lo que encuentra es que la solución devuelta por el solucionador está saltando, aunque la función realmente no parece tan diferente. El problema es que su estimación inicial de 0.0001 se encuentra cerca de un mínimo mínimo de la función, y el solucionador no puede averiguar cómo salir de allí. Al establecer la estimación inicial en 1.0 (muy lejos, pero en una parte descendente agradable y fácil de la función que se dirigirá directamente a la raíz), los resultados en: introduzca la descripción de la imagen aquí

    Entonces, tres cosas: 1. Los solucionadores necesitan cuidado y atención amorosos: rara vez son automáticos.

    1. A veces, la conjetura inicial “correcta” puede estar muy lejos de lo que usted sabe que es la respuesta correcta, pero de tal manera que el solucionador lo tenga fácil.

    2. La consola interactiva de Python te permite ver rápidamente lo que está sucediendo. ¡Usa el poder de eso!