Po raz pierwszy używam funkcji optimize.fsolve dla scipy, aby znaleźć korzenie równania. Problem polega na tym, że niezależnie od liczby używanej jako wartość przypuszczenia/wartości szacunkowej, otrzymuję odpowiedź jako odpowiedź (z dokładnością do 8 miejsc po przecinku). Używając full_output = True, otrzymuję exitflag o wartości "1", co powinno oznaczać, że "Rozwiązanie jest konwergentne", co najlepiej zrozumiałe powinno oznaczać, że dane wyjściowe są rzeczywiście źródłem równania.fsolve zawsze zwraca wartość domyślną
Wiem, że istnieje skończona liczba odrębnych korzeni (które są oddalone od siebie), jak wtedy, gdy wykreślam równanie, które widzę. Ponadto, fsolve kończy się niepowodzeniem (daje znaki wyjścia błędu), kiedy wprowadzam punkt początkowy w zakres, który powinien zwracać niezdefiniowane wartości (dzielenie przez zero, pierwiastek kwadratowy z wartości ujemnej). Poza tym zawsze zwraca punkt początkowy jako root.
Testowałem fsolve z bardzo prostym równaniem i działało dobrze, więc wiem, że importuję wszystko, czego potrzebuję i powinno się poprawnie używać fsolve. Próbowałam też poradzić sobie z niektórymi argumentami wejściowymi, ale nie rozumiem ich bardzo dobrze i nic się nie zmieniło).
Poniżej znajduje się odpowiedni kod (E jest jedyną zmienną, wszystko ma wartość niezerową):
def func(E):
s = sqrt(c_sqr * (1 - E/V_0))
f = s/tan(s) + sqrt(c_sqr - s**2)
return f
guess = 3
fsolve(func, guess)
który właśnie wyprowadza „3” i mówi, choć "Rozwiązanie konwergentnych. najbliższe rozwiązania powinny wynosić około 2,8 i 4,7.
Czy ktoś ma pomysł, jak to naprawić i uzyskać poprawną odpowiedź (przy użyciu fsolve)?
Być może jesteś po prostu bardzo dobrym zgadywaczem. –
Jaka jest wartość dla 'V_0'? –
Czy możesz podać wartości dla 'V_0' i' c_sqr'?Próbowałem wstawić 'c_sqr = 100' i' V_0 = 10', i to poprawnie łączy się z root 2.90496355. –