#python #scipy
#python #scipy
Вопрос:
Я хотел бы решить такую систему уравнений:
21.7424698112 = A B*2^{-x}
22.4531418345 = A B*3^{-x}
23.8033967265 = A B*4^{-x}
Я написал скрипт для поиска переменных A, B и x:
#!/usr/bin/env python
import numpy as np
from scipy.optimize import root
def your_funcs(X):
A, B, x = X
f = [21.7424698112-A-B*(1/2**x),
22.4531418345-A-B*(1/3**x),
23.8033967265-A-B*(1/4**x)]
return f
sol = root(your_funcs, [1.0, 1.0, 1.0])
print(sol.x)
Этот подход приводит к следующему решению:
[ 22.66633613 -50.69139062 105.89893632]
Я проверил решение и оказалось, что эти значения не удовлетворяют приведенным выше уравнениям. Что я делаю не так? Должен ли я что-то знать?
Комментарии:
1. Вам не хватает отрицательных знаков, плюс константы отличаются в вашем вопросе и в вашем коде
2. @Sheldore Ты прав. Я исправил свой пост. Решение по-прежнему неверно.
3. Я получаю тот же ответ, что и @joni ниже, и решение удовлетворяет всем трем уравнениям одновременно. Что не так? Вам все еще не хватает отрицательных знаков перед константами в ваших уравнениях в функции. Вы понимаете это?
4. Решателю требуется лучшее начальное предположение. Он работает, например, с
sol = root(your_funcs, [5.0, 1.0, -1.0])
. Решение тогда[21.42987711, 0.04116848, -2.92467199]
.5. К вашему сведению: В будущем всегда проверяйте
sol.success
перед использованиемsol.x
. Когдаroot
выполняется с начальным предположением[1.0, 1.0, 1.0]
,sol.success
является ложным иsol.message
является'The iteration is not making good progress, as measured by the n improvement from the last ten iterations.'
.