система уравнений SciPy

#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.' .