MAXIMA - Решите переопределенную систему, используя оценку наименьших квадратов

Я отчаянно пытаюсь разрешить переопределенную систему, используя Maxima и функцию lsquares_estimate.

Система описывается этим матричным уравнением: M.D = I

Вот М:

M:matrix([19.707,0.06700000000000017,0,0,0,0,0,0,19.707-Phi01_8,0,0,0],
[0,0,-0.2690000000000019,0.7359999999999971,0,0,0,0,0,19.371-Phi01_8,0,0],
[-0.067234,-24.562234,0,0,0,0,0,0,-Phi12_8-0.067234,0,0,0],
[0,0,-1.753,3.741,0,0,0,0,0,22.742-Phi12_8,0,0],
[-0.26894,1.75226,0,0,0,0,0,0,-Phi23_8-0.26894,0,0,0],   
[0,0,92.99119999999999,14.967,0,0,0,0,0,90.97-Phi23_8,0,0],
[-0.73571,3.74149,0,0,0,0,0,0,-Phi34_8-0.73571,0,0,0],
[0,0,-14.9658,-655.2429999999999,0,0,0,0,0,-Phi34_8-19.443,0,0],
[-1.8393,9.3537,0,0,0,0,0,0,-Phi45_8-1.8393,0,0,0],
[0,0,-37.415,361.892,0,0,0,0,0,-Phi45_8-48.608,0,0],
[-8.6658,5.6092,0,0,0,0,0,0,-Phi56_8-8.6658,0,0,0],
[0,0,-22.437,166.598,0,0,0,0,0,-Phi56_8-36.712,0,0],
[-5.1995,3.3655,0,0,0,0,0,0,-Phi67_8-5.1995,0,0,0],
[0,0,-13.462,99.953,0,0,0,0,0,-Phi67_8-22.027,0,0])

Вот Д:

D:matrix([0.0499998750003125],
[0.0399993670651863],
[0.009999946119925522],
[0.001250003764581481],
[4.999947987060861*10^-4],
[1.000099826698366*10^-4],
[1.666560996027836*10^-4],
[0.00499998750003125],
[D8],[D9],[D10],[D11])

И вот я:

I:matrix([1],[0],[-1],[0],[0],[1],[0],[-1],[0],[0],[0],[0],[0],[0])

В системе 14 уравнений и 9 переменных. (D8,D9,Phi01,Phi12,Phi23,Phi34,Phi45,Phi56,Phi67) Я хочу получить оценку этих переменных методом наименьших квадратов. Я использую функцию «lsquares_estimates». Чтобы правильно ввести функцию, я объединяю матричное уравнение в одну матрицу. Вот как я вызываю функцию lsquares_estimates:

D0:D[1][1]$
D1:D[2][1]$
D2:D[3][1]$
D3:D[4][1]$
D4:D[5][1]$
D5:D[6][1]$
D6:D[7][1]$
D7:D[8][1]$
D8:D[9][1]$
D9:D[10][1]$
D10:D[11][1]$
D11:D[12][1]$

C:addcol(M,I);
resultat:lsquares_estimates(C,
[c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,Ie],
Ie=c0*D0+c1*D1+c2*D2+c3*D3+c4*D4+c5*D5+c6*D6+c7*D7+c8*D8+c9*D9+c10*D10+c11*D11,
[Phi01_8,Phi12_8,Phi23_8,Phi34_8,Phi45_8,Phi56_8,Phi67_8,D8,D9]);

Очевидно, что Maxima не может разрешить эту систему... Она продолжает работать очень долго, и иногда я получаю вот такую ​​ошибку:

Maxima encountered a Lisp error:
-: ((MTIMES SIMP) -0.14285714285714285
 ((MPLUS SIMP)
  ((MTIMES SIMP)
   ((MPLUS SIMP) 0.01197250577547404
    ((MTIMES SIMP) -1.0 ((MPLUS SIMP) 19.707 ((MTIMES SIMP) -1.0 |$Phi01_8|))))
   ((MPLUS SIMP) 19.707 ((MTIMES SIMP) -1.0 |$Phi01_8|)))
  ((MTIMES SIMP)
   ((MPLUS SIMP) -0.014164494697229801
    ((MTIMES SIMP) -1.0
     ((MPLUS SIMP) -0.067234 ((MTIMES SIMP) -1.0 |$Phi12_8|))))
   ((MPLUS SIMP) -0.067234 ((MTIMES SIMP) -1.0 |$Phi12_8|)))
  ((MTIMES SIMP)
   ((MPLUS SIMP) -0.056642324551059296
    ((MTIMES SIMP) -1.0
     ((MPLUS SIMP) -0.26894 ((MTIMES SIMP) -1.0 |$Phi23_8|))))
   ((MPLUS SIMP) -0.26894 ((MTIMES SIMP) -1.0 |$Phi23_8|)))
  ((MTIMES SIMP)
   ((MPLUS SIMP) -0.11287182384424398
    ((MTIMES SIMP) -1.0
     ((MPLUS SIMP) -0.73571 ((MTIMES SIMP) -1.0 |$Phi34_8|))))
   ((MPLUS SIMP) -0.73571 ((MTIMES SIMP) -1.0 |$Phi34_8|)))
  ((MTIMES SIMP)
   ((MPLUS SIMP) -0.28217730962955834
    ((MTIMES SIMP) -1.0
     ((MPLUS SIMP) -1.8393 ((MTIMES SIMP) -1.0 |$Phi45_8|))))
   ((MPLUS SIMP) -1.8393 ((MTIMES SIMP) -1.0 |$Phi45_8|)))
  ((MTIMES SIMP)
   ((MPLUS SIMP) 0.2089244670356651
    ((MTIMES SIMP) -1.0
     ((MPLUS SIMP) -8.6658 ((MTIMES SIMP) -1.0 |$Phi56_8|))))
   ((MPLUS SIMP) -8.6658 ((MTIMES SIMP) -1.0 |$Phi56_8|)))
  ((MTIMES SIMP)
   ((MPLUS SIMP) 0.12535648020624035
    ((MTIMES SIMP) -1.0
     ((MPLUS SIMP) -5.1995 ((MTIMES SIMP) -1.0 |$Phi67_8|))))
   ((MPLUS SIMP) -5.1995 ((MTIMES SIMP) -1.0 |$Phi67_8|))))) is not a number
Automatically continuing.
To enable the Lisp debugger set *debugger-hook* to nil.

Я неправильно использую lsquares_estimates? Когда я уменьшаю количество уравнений, чтобы оно соответствовало количеству переменных, я могу получить результат, но мне нужен точный результат, используя все мои уравнения.

Любая помощь будет очень признательна... Заранее спасибо.


person lilian    schedule 27.06.2017    source источник


Ответы (1)


lsquares_estimates строит выражение среднеквадратичной ошибки, а затем пытается решить его точно, а затем приблизительно, если точное решение не дает результата. Не уверен, что там что-то идет не так.

Но в любом случае вы можете сразу перейти к lsquares_estimates_approximate. Попробуй это:

e1 : M.D - I;
my_mse : transpose(e1) . e1;
load (lsquares);
lsquares_estimates_approximate (my_mse, [Phi01_8, Phi12_8, Phi23_8, 
    Phi34_8, Phi45_8, Phi56_8, Phi67_8, D8, D9], tol=1e-4);

Обратите внимание, что my_mse — это квадрат нормы ошибки.

С этими входами я получаю:

[[Phi01_8 = 22.70059866292853,Phi12_8 = -4.329661712144546,
  Phi23_8 = -17.40507905561839,Phi34_8 = -34.32504757490423,
  Phi45_8 = -85.85849926978096,Phi56_8 = 54.09091751735507,
  Phi67_8 = 32.46719922407783,D8 = -0.003346473781793617,
  D9 = 2.1359057759474724E-5]]
person Robert Dodier    schedule 27.06.2017
comment
Большое спасибо за ответ. Выводятся не те значения, которые я ожидал, возможно, что-то не так с моей системой. Но все же я сейчас попробую воспользоваться этой функцией. - person lilian; 28.06.2017
comment
Попробуйте сделать tol меньшим значением (например, попробуйте 1e-6 и/или 1e-8). Иногда это меняет результаты. - person Robert Dodier; 28.06.2017
comment
@lilian Также попробуйте подставить решение в my_mse и убедитесь, что это число близко к нулю. Например. subst(my_soln[1], my_mse);, где my_soln — результат, возвращаемый lsquares_estimates_approximate. - person Robert Dodier; 28.06.2017
comment
Большое спасибо. Это довольно странно, потому что когда я удаляю некоторые уравнения из своей системы, я получаю более точный результат. Например, при подстановке решения квадрат нормы ошибки может перейти от 3E-2 к 5E-4... Должно быть, что-то не так с моей системой. - person lilian; 03.07.2017
comment
Нет, ничего страшного, этого следовало ожидать. Ошибка представляет собой сумму членов e1^2 + e2^2 + e3^2 + ... . Если вы удалите некоторые из них, вы получите меньшую сумму. - person Robert Dodier; 03.07.2017
comment
Есть еще что-то, чего я не понимаю. Теперь у меня есть 8 уравнений и 6 неизвестных. При использовании этих 8 уравнений lsquares_estimates не прекращает вычисления и никогда не дает решения. При удалении двух из этих уравнений получается идеальный результат... Но мне нужно использовать все мои уравнения... lsquares_estimates_ приблизительно дает решение в обоих случаях, но всегда неправильное. Есть ли способ улучшить аппроксимацию? - person lilian; 05.07.2017
comment
lsquares_estimates не перестает считать: ну, пытается найти точный результат и не может. Это ограничение функции для решения системы уравнений. Извини за это. lsquares_estimates_ приблизительно дает решение в обоих случаях, но всегда неправильное. В каком смысле неправильно? Остаточная ошибка мала. Если вам нужно получить меньшую ошибку, уменьшите tol. Кроме того, я заметил, что некоторые элементы решения намного больше других. Это может сделать определение более мелких элементов менее точным. Возможно, вы сможете как-то изменить масштаб уравнений. - person Robert Dodier; 05.07.2017
comment
Спасибо за ваши ответы. В каком смысле неправильно? Это не ожидаемое решение с точки зрения физики уравнения (например, все значения D должны быть строго положительными). lsquares_estimates дает правильное решение, когда дает столько уравнений, сколько неизвестных, но не может работать с переопределенной системой. Я пытался сделать tol как можно меньше, но это не дает мне более точного результата. Я постараюсь изменить масштаб уравнений, это может быть хорошей идеей! - person lilian; 06.07.2017
comment
Если некоторые значения должны быть строго положительными, вам нужно решить задачу условной минимизации. Я могу попытаться помочь с этим, если вы хотите пойти по этому пути. Я пытался сделать tol как можно меньше, но это не дает мне более точного результата. -- Я не знаю, что вы хотите этим сказать. Если tol меньше, то сумма квадратов ошибок меньше, т. е. вы ближе к решению — это определение метода наименьших квадратов. Если вы предполагаете какой-то другой критерий, то вы должны сформулировать и решить другую задачу (например, задачу минимизации с ограничениями). - person Robert Dodier; 06.07.2017
comment
Под точным результатом я имел в виду решение, близкое к ожидаемому с точки зрения физики системы. Между прочим, уменьшение tol в определенной точке не означает уменьшение суммы квадратов ошибок ... Эта система уравнений получается из моделирования электрической цепи и с использованием законов Кирхгофа. D – значения электрических проводимостей (1/R). Я ожидаю, что моя система даст значения D, которые я использовал в своей симуляции (которые являются правильными значениями, о которых я говорю). Я получаю эти значения, используя lsquares_estimates (но только с ограниченным числом уравнений). - person lilian; 07.07.2017
comment
Было бы интересно добавить какой-то другой критерий (например, D > 0). Является ли это возможным ? Может быть, я получу лучшие результаты. - person lilian; 07.07.2017
comment
Какое значение SSE вы получаете от lsquares_estimates_ приблизительно? Какое значение вы получите, если подставите то, что считаете правильным, в выражение для SSE? Какие значения параметров вы считаете правильными? Спасибо за информацию. - person Robert Dodier; 07.07.2017
comment
Из lsquares_estimates_ приблизительно я получаю значение SSE 0.157. Если я подставлю то, что считаю правильным значением, я получу 5.850976755608908*10^-9... Может быть, мне следует добавить условие D>0, как я могу это сделать? Значения, которые я считаю правильными: expected:[Phi01_8 = 37.717368, Phi12_8 = 7.203531, Phi23_8 = 5.6027463, Phi34_8 = -0.94668253, Phi45_8 = -0.4733412, Phi56_8 = -2.462832, Phi67_8 = -6.1570797, D8 = 0.0166666, D9 = 0.022222, D10 = 0.03333333, D11 = 0.025]; (Это не та же система, что и раньше, но проблема та же, скажите, нужна ли вам вся система) - person lilian; 10.07.2017
comment
Спасибо за дополнительную информацию, я постараюсь взглянуть на нее в ближайшие несколько дней. Что это за система, для которой expected является правильным результатом? - person Robert Dodier; 10.07.2017
comment
@lilian Когда я подставляю expected в my_mse, я получаю 5,847992... в то время как lsquares_estimates_approximate возвращает решение с MSE = 0,009095.... Я вижу, что expected включает переменные (D10, D11), которых нет в my_mse. Как вы сказали, это решение родственного, но другого уравнения. В целом решения довольно тесно связаны с уравнениями; если у вас нет конкретной информации о вашей проблеме, нет причин ожидать, что решение одного уравнения будет работать в другом. На данный момент мое единственное предположение состоит в том, что вы решаете не ту проблему, которую действительно хотите решить. - person Robert Dodier; 16.07.2017
comment
Это нормально. Ожидаемый вектор и значение mse, которые я вам дал, не относятся к системе, которую я отправил ранее. Я отправлю вам правильный - person lilian; 17.07.2017