Für E=0.46732451
und t=1.07589765
Ich versuche, für die obere Grenze des Integrals zu lösen t = \ int_ {0}^{z} 1/sqrt (2 * (0.46732451-z ** 2)), Zeichnete ich diese Funktion und es sieht so aus .Python: fsolve in der Nähe asymptotischer Bereich
Um t=1
es Art von Asymptoten.
Ich habe den folgenden Code
import numpy as np
from scipy import integrate
from scipy.optimize import fsolve
def fg(z_up,t,E):
def h(z,E):
return 1/(np.sqrt(2*(E-z**2)))
b, err = integrate.quad(h, 0, z_up,args=(E))
return b-t
x0 = 0.1
print fsolve(fg, x0, args=(1.07589765, 0.46732451))[0]
Aber dieser Code nur die Vermutung Wert ausgibt, egal, was ich gesagt, so dass ich vermute, es hat etwas mit der Tatsache, dass die Kurve Asymptoten dort zu tun. Ich sollte beachten, dass dieser Code für andere Werte von t
funktioniert, die von der asymptotischen Region entfernt sind.
Kann mir jemand helfen, dies zu lösen?
Dank
EDIT Nach dem Spielen um für eine Weile, löste ich das Problem, aber es ist so eine Art Patchwork, es funktioniert nur für ähnliche Probleme in der Regel nicht (oder doch?)
Ich habe folgende Änderungen vorgenommen: Der Maximalwert, den z
erreichen kann, ist sqrt(0.46732451)
, also setze ich x0=0.5*np.sqrt(0.46732451)
und setze factor
irgendwo zwischen 0.1
bis 1
, und die richtige Antwort herauskommt. Ich habe keine Erklärung dafür, vielleicht kann jemand, der ein Experte in dieser Angelegenheit ist, helfen?
fsolve wird gelegentlich Werte relativ weit weg von Ihrem Ausgangspunkt versuchen. Dies kann dazu führen, dass das Argument für sqrt negativ wird. Sie sollten zuerst nach dem Argument suchen und einen speziellen Wert zurückgeben, der angibt, "versuchen Sie es nicht", wenn das Argument kleiner als 0 ist (ein einigermaßen großer Wert kann funktionieren). – Evert
Überprüfen Sie, ob das Argument tatsächlich '2 * (E - z ** 2) 'ist und nicht zum Beispiel' 2 * (E - z) ** 2 '. – Evert
Nein, das Argument ist 2 * (E - z ** 2) – HuShu