Решение нелинейной системы уравнений в матричной форме на Python

Я пытаюсь решить нелинейную систему уравнений вида AX = X, где,

A = матрица размера M на M

X = матрица размера M на 1

Таким образом, всего у меня есть M (= 200) уравнений (и M неизвестных).

В частности,

A = [f11(x,y) f12(x,y) .... f1m(x,y),

 f21(x,y) f22(x,y) .....f2m(x,y),

 ..        ..           ..

 fm1(x,y) fm2(x,y) .... fmm(x,y)]

X = [V1,

   V2,

   V3,
   .
   .
   Vm-2,
   0.33,
   0.33]

Таким образом, у X есть M-2 неизвестных (V1, V2 ... Vm-1), а у A два (x и y). Элементы A являются ЛИНЕЙНЫМИ функциями x и y.

Я сделал домашнее задание по scipy.fsolve и sympy.nsolve, но они, похоже, не принимают уравнения в матричном формате. Кроме того, поскольку существует 200 уравнений, и каждое уравнение будет иметь все неизвестное, нецелесообразно исключать переменные одну за другой.

Я относительно новичок в Python, поэтому приветствую любую помощь.

Благодарность


person user1618128    schedule 22.08.2012    source источник
comment
да, это действительные числа, а также x и y. Линейная функция fij также отображается в вещественное число. Например, fij = 0,21 - x- y   -  person user1618128    schedule 23.08.2012


Ответы (1)


Пусть f ij (x, y) = a i x + b j y. Пусть a = (a 1, ..., a m), b = (b 1, ..., b m) и v = (V 1, ... V m-2, 1/3, 1/3) быть действительными векторами-столбцами. потом

A = [f ij (x, y)] m × m = [a i x + b j y] m × m = [a i x] m × 1 [b j y] 1 × m = ([a i] m × 1 x) ([b j] 1 × m y)

Ваше уравнение Av = v или Av = Iv (где I - единичная матрица размера m × m), поэтому вы хотите решить (A-I) v = 0. Это напоминает задачу на собственные значения. характеристическое уравнение для этой проблемы собственных значений: 0 = det (AI) = det (([ a i] m × 1 x) ([b j] 1 × m y) - I), где det - определитель (я зафиксировал собственное значение на 1).

Возможный подход заключается в численном решении det (([a i] m × 1 x) ([b j] 1 × m y) - I) = 0 для x и y (с использованием алгоритма поиска корня, такого как Метод Ньютона), что дает постоянную матрицу A.

Затем вернитесь и используйте средство решения линейных уравнений для решения (AI) v = 0, чтобы найти v 1, v 2, ..., v m- 2, используя вашу постоянную матрицу A, которую вы решили численно. К сожалению, это не сохранит ваши 1/3 константы в нижней части v, поэтому вам придется вернуться и повторить предыдущий шаг несколько раз, пока вы не получите матрицу A, которая приблизительно равна 1/3 для последних двух значений. .


Альтернативным решением было бы просто вставить все это в программу решения нелинейных уравнений. Этот подход будет медленнее, чем тот, который я объяснил выше.

person Snowball    schedule 22.08.2012
comment
Благодарю за ответ. Думать об этой проблеме как о проблеме собственных значений, безусловно, является одним из способов ее решения. Однако, что касается включения этого в решатель нелинейных уравнений (например, fsolve или nsolve), я понимаю, что он по-прежнему требует, чтобы я переписал свои уравнения в формате AX = B, где A имеет все знания, а X имеет все неизвестных, что не так просто для 200 уравнений. я ошибаюсь? - person user1618128; 28.08.2012
comment
@ user1618128: Вы не ошиблись, это будет просто система из 200 уравнений. Часть над горизонтальной линией, вероятно, является лучшим подходом из двух (хотя я не пробовал, поэтому он может вообще не сработать). - person Snowball; 28.08.2012