Я впервые использую функцию scipy optimize.fsolve, чтобы найти корни уравнения. Проблема в том, что любое число, которое я использую в качестве значения предположения / оценки, - это то, что я получаю в качестве своего ответа (с точностью до 8 знаков после запятой). При использовании full_output = True я получаю флаг выхода равным «1», что должно означать, что «Решение сошлось», что, насколько я понимаю, должно означать, что результат действительно является корнем уравнения.
Я знаю, что существует конечное число различных корней (которые разнесены друг на друга), поскольку, когда я рисую уравнение, я могу их видеть. Кроме того, fsolve не работает (выдает ошибки выхода), когда я ввожу начальную точку в диапазон, который должен возвращать неопределенные значения (деление на ноль, квадратный корень из отрицательного значения). Но помимо этого он всегда возвращает начальную точку как корень.
Я тестировал fsolve с очень простым уравнением, и он работал нормально, поэтому я знаю, что импортирую все, что мне нужно, и должен правильно использовать fsolve. Я также пробовал возиться с некоторыми входными аргументами, но я их не очень хорошо понимаю и, похоже, ничего не изменилось).
Ниже приведен соответствующий код (E - единственная переменная, все остальное имеет ненулевое значение):
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)
который просто выводит «3» и говорит: «Решение конвергировано.», хотя самые близкие решения должны быть примерно на уровне 2,8 и 4,7.
Кто-нибудь знает, как это исправить и получить правильный ответ (с помощью fsolve)?
V_0
иc_sqr
? Пробовал ставитьc_sqr = 100
иV_0 = 10
, и он правильно сходится в корень 2.90496355. - person Paolo Capriotti   schedule 19.12.2011