используя `fsolve` для решения m уравнений с n неизвестными, где n <m - PullRequest
0 голосов
/ 24 апреля 2019

Представьте, что у меня есть два уравнения с одним неизвестным, и я хочу использовать fsolve, чтобы решить его:

0 = 0.5*x[0]**2-2
0 = 2-x

Ясно, что ответ x=2.Я пробовал это

import numpy as np; from scipy.optimize import fsolve
def f(x):
    r  = np.zeros(2)
    r[0] =  0.5*x[0]**2-2
    r[1] = 2-x[0]

    return r

fsolve(f,[0.5])

Сообщение об ошибке "Массив, возвращаемый функцией, изменил размер между вызовами"

Я не вижу, что происходит не такВот.Как мне решить эту проблему?

В общем, Как мне решить уравнения, в которых число переменных меньше числа уравнений.

Вот полное сообщение

Traceback (most recent call last):

  File "<ipython-input-37-e4f77791f3f6>", line 12, in <module>
    fsolve(f,[0.5])

  File "... anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 148, in fsolve
    res = _root_hybr(func, x0, args, jac=fprime, **options)

  File ".... /anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 227, in _root_hybr
    ml, mu, epsfcn, factor, diag)

ValueError: The array returned by a function changed size between calls

1 Ответ

1 голос
/ 26 апреля 2019

В случае переопределенной системы (число уравнений больше, чем число переменных) вам необходимо использовать, например, метод наименьших квадратов. В таких случаях обычно нет решения в традиционном смысле. И нам нужно определить, что мы должны рассматривать как решение системы.

Пусть у вас есть система двух уравнений с одной скалярной переменной:

f (x) = 0 г (х) = 0

Эта система обычно несовместима и не имеет решения в традиционном смысле.

Позволяет добавить некоторые значения eps1 и eps2 в правую часть системы:

f (x) = 0 + eps1 г (х) = 0 + eps2

eps1 и eps2 - некоторые значения;

Теперь давайте найдем такое x, когда eps1^2 + eps2^2 поднимется до минимального значения; это будет решением системы в смысле наименьших квадратов.

Чтобы получить такое решение с помощью scipy, вы можете использовать функцию less_square .

Давайте посмотрим на следующий фрагмент кода, который решает вашу систему уравнений:

import numpy as np
from scipy.optimize import fsolve, least_squares
def f(x):
    r  = np.zeros(2)
    r[0] =  0.5*x**2-2
    r[1] = 2-x

    return r

least_squares(f, [0.0])

Результат:

active_mask: array([0.])
        cost: 5.175333019854869e-20
         fun: array([ 2.87759150e-10, -1.43879575e-10])
        grad: array([7.19397879e-10])
         jac: array([[ 2.00000001],
       [-1.        ]])
     message: '`gtol` termination condition is satisfied.'
        nfev: 6
        njev: 6
  optimality: 7.193978788924559e-10
      status: 1
     success: True
           x: array([2.])
...