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

Я пытаюсь решить четыре неизвестные переменные x_Trag, y_Trag, x_Zug, y_Zug с помощью четырех уравнений eqx, eqy, Py_Trag, Py_Zug. К сожалению, работает только простой тестовый пример.

Вот паста Wxmaxima:

(%i1)   kill(all); load(ezunits);
Warning: Can set maxima's working directory but cannot change it during the maxima session :

(%o0)   done

(%o1)   "C:/maxima-5.44.0/share/maxima/5.44.0/share/ezunits/ezunits.mac"
  1 easy values work
  1.1 vars
(%i2)   x_GG: 1`mm;
(x_GG)  1 ` mm
(%i3)   y_GG: 18`mm;
(y_GG)  18 ` mm
(%i4)   L_HR: 5`mm;
(L_HR)  5 ` mm
(%i5)   L_Trag: 5`mm;
(L_Trag)    5 ` mm
(%i6)   L_Zug: 15`mm;
(L_Zug) 15 ` mm
(%i7)   x_HR: 4`mm;
(x_HR)  4 ` mm
(%i8)   y_HR: 3`mm;
(y_HR)  3 ` mm
  1.2 equations
(%i9)   eqx: x_Zug=x_GG+x_HR+x_Trag;
(eqx)   x_Zug=x_Trag+5 ` mm
(%i10)  eqy: y_GG=y_HR+y_Zug+y_Trag;
(eqy)   18 ` mm=y_Zug+y_Trag+3 ` mm
(%i11)  Py_Trag: L_Trag^2=x_Trag^2+y_Trag^2;
(Py_Trag)   25 ` mm^2=y_Trag^2+x_Trag^2
(%i12)  Py_Zug: L_Zug^2=x_Zug^2+y_Zug^2;
(Py_Zug)    225 ` mm^2=y_Zug^2+x_Zug^2
  1.3 solving works
(%i13)  res: dimensionally(solve([eqx, eqy, Py_Trag, Py_Zug], [x_Trag, y_Trag, x_Zug, y_Zug]))[1];
(res)   [x_Trag=4 ` mm,y_Trag=3 ` mm,x_Zug=9 ` mm,y_Zug=12 ` mm]
  2 but not the ones I need
  2.1 vars
(%i14)  x_GG: 2`mm;
(x_GG)  2 ` mm
(%i15)  y_GG: 193`mm;
(y_GG)  193 ` mm
(%i16)  L_HR: 46`mm;
(L_HR)  46 ` mm
(%i17)  L_Trag: 50`mm;
(L_Trag)    50 ` mm
(%i18)  L_Zug: 190`mm;
(L_Zug) 190 ` mm
(%i19)  x_HR: 46*cos((149*%pi-360*acos(1/3))/360) ` mm;
(x_HR)  46*cos((149*%pi-360*acos(1/3))/360) ` mm
(%i20)  y_HR: 46*sin((149*%pi-360*acos(1/3))/360) ` mm;
(y_HR)  46*sin((149*%pi-360*acos(1/3))/360) ` mm
  2.2 equations
(%i21)  eqx: x_Zug=x_GG+x_HR+x_Trag;
(eqx)   x_Zug=x_Trag+(46*cos((149*%pi-360*acos(1/3))/360)+2) ` mm
(%i22)  eqy: y_GG=y_HR+y_Zug+y_Trag;
(eqy)   193 ` mm=y_Zug+y_Trag+46*sin((149*%pi-360*acos(1/3))/360) ` mm
(%i23)  Py_Trag: L_Trag^2=x_Trag^2+y_Trag^2;
(Py_Trag)   2500 ` mm^2=y_Trag^2+x_Trag^2
(%i24)  Py_Zug: L_Zug^2=x_Zug^2+y_Zug^2;
(Py_Zug)    36100 ` mm^2=y_Zug^2+x_Zug^2
  2.3 solving takes very long, but dosen't find a solution
(%i26)  res: dimensionally(solve([eqx, eqy, Py_Trag, Py_Zug], [x_Trag, y_Trag, x_Zug, y_Zug])); float(%);
(res)   []
(%o26)  []

wxm-файл, который лучше вставить:

/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/
/* [ Created with wxMaxima version 21.02.0 ] */
/* [wxMaxima: input   start ] */
kill(all); load(ezunits);
/* [wxMaxima: input   end   ] */


/* [wxMaxima: section start ]
easy values work
   [wxMaxima: section end   ] */


/* [wxMaxima: subsect start ]
vars
   [wxMaxima: subsect end   ] */


/* [wxMaxima: input   start ] */
x_GG: 1`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
y_GG: 18`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
L_HR: 5`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
L_Trag: 5`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
L_Zug: 15`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
x_HR: 4`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
y_HR: 3`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: subsect start ]
equations
   [wxMaxima: subsect end   ] */


/* [wxMaxima: input   start ] */
eqx: x_Zug=x_GG+x_HR+x_Trag;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
eqy: y_GG=y_HR+y_Zug+y_Trag;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
Py_Trag: L_Trag^2=x_Trag^2+y_Trag^2;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
Py_Zug: L_Zug^2=x_Zug^2+y_Zug^2;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: subsect start ]
solving works
   [wxMaxima: subsect end   ] */


/* [wxMaxima: input   start ] */
res: dimensionally(solve([eqx, eqy, Py_Trag, Py_Zug], [x_Trag, y_Trag, x_Zug, y_Zug]))[1];
/* [wxMaxima: input   end   ] */


/* [wxMaxima: section start ]
but not the ones I need
   [wxMaxima: section end   ] */


/* [wxMaxima: subsect start ]
vars
   [wxMaxima: subsect end   ] */


/* [wxMaxima: input   start ] */
x_GG: 2`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
y_GG: 193`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
L_HR: 46`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
L_Trag: 50`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
L_Zug: 190`mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
x_HR: 46*cos((149*%pi-360*acos(1/3))/360) ` mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
y_HR: 46*sin((149*%pi-360*acos(1/3))/360) ` mm;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: subsect start ]
equations
   [wxMaxima: subsect end   ] */


/* [wxMaxima: input   start ] */
eqx: x_Zug=x_GG+x_HR+x_Trag;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
eqy: y_GG=y_HR+y_Zug+y_Trag;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
Py_Trag: L_Trag^2=x_Trag^2+y_Trag^2;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: input   start ] */
Py_Zug: L_Zug^2=x_Zug^2+y_Zug^2;
/* [wxMaxima: input   end   ] */


/* [wxMaxima: subsect start ]
solving takes very long, but dosen't find a solution
   [wxMaxima: subsect end   ] */


/* [wxMaxima: input   start ] */
res: dimensionally(solve([eqx, eqy, Py_Trag, Py_Zug], [x_Trag, y_Trag, x_Zug, y_Zug])); float(%);
/* [wxMaxima: input   end   ] */



/* Old versions of Maxima abort on loading files that end in a comment. */
"Created with wxMaxima 21.02.0"$

person Dux    schedule 16.05.2021    source источник
comment
Похоже, что неспособность найти решение является слабостью solve. Похоже, что у него проблемы с двумя вещами: (1) наличием дополнительной переменной, соответствующей mm, которая просто помогает, и (2) наличием выражений cos(...) и sin(...). Любого из них кажется достаточно, чтобы solve не смог найти решение. Я постараюсь привести минимальные примеры, демонстрирующие это. Однако это не очень полезно. Кажется, я припоминаю, что кто-то недавно разместил в списке рассылки информацию о решении подобных уравнений, дав достаточно подсказок. Я постараюсь узнать.   -  person Robert Dodier    schedule 17.05.2021


Ответы (1)


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

Вот мой скрипт, который вы можете запустить через maxima --batch. Решения, которые он находит, довольно запутаны, поэтому, я думаю, вам придется решить, полезны ли они на практике. Одна вещь, которую можно попытаться сделать немного чище, это написать, скажем, cos_a и sin_a вместо cos(...) и sin(...). Затем вы можете заменить cos_a и sin_a после решения.

linel: 65 $
load(ezunits);
x_GG: 2`mm;
y_GG: 193`mm;
L_HR: 46`mm;
L_Trag: 50`mm;
L_Zug: 190`mm;
x_HR: 46*cos((149*%pi-360*acos(1/3))/360) ` mm;
y_HR: 46*sin((149*%pi-360*acos(1/3))/360) ` mm;
eqx: x_Zug=x_GG+x_HR+x_Trag;
eqy: y_GG=y_HR+y_Zug+y_Trag;
Py_Trag: L_Trag^2=x_Trag^2+y_Trag^2;
Py_Zug: L_Zug^2=x_Zug^2+y_Zug^2;

dimensionally (eliminate ([eqx, eqy, Py_Trag, Py_Zug], [x_Trag, x_Zug]));
solutions_y: dimensionally (solve (%, [y_Trag, y_Zug]));
grind (solutions_y);
solutions_y_numerical: float (solutions_y);
solutions_y_numerical_filtered: sublist (%, lambda ([e], every (lambda ([x], qty(x) > 0), map (rhs, e))));

dimensionally (eliminate ([eqx, eqy, Py_Trag, Py_Zug], [y_Trag, y_Zug]));
solutions_x: dimensionally (solve (%, [x_Trag, x_Zug]));
grind (solutions_x);
solutions_x_numerical: float (solutions_x);
solutions_x_numerical_filtered: sublist (%, lambda ([e], every (lambda ([x], qty(x) > 0), map (rhs, e))));

solutions_numerical_filtered: append (solutions_x_numerical_filtered[1], solutions_y_numerical_filtered[1]);
subst (%, [eqx, eqy, Py_Trag, Py_Zug]), numer;

Настройка проблемы такая же, как и у вас, новые вещи начиная с eliminate. Численное решение, напечатанное ближе к концу, равно

[x_Trag = 44.09785089359991 ` mm, 
x_Zug = 91.98740317879643 ` mm, 
y_Trag = 23.56649202927388 ` mm, 
y_Zug = 166.2477598538445 ` mm]

(Я предполагал, что решения с отрицательными величинами нефизичны — думаю, вы можете сказать наверняка.)

Я также попробовал to_poly_solve, который входит в состав Maxima; он не смог решить исходные уравнения.

Я работаю с Максима 5.44. На более ранних версиях не пробовал.

person Robert Dodier    schedule 17.05.2021