Решение m уравнений с n неизвестными, такими как m<n
, означает, что некоторые переменные будут параметрами, зависящими от других переменных.
Например
x-3y+z = 2
x-y+5z = 5
Предположим, z
является параметром
Чтобы решить эту проблему в Matlab вот код
syms x y z
eq1 = x-3*y+z ==2;
eq2 = x-y+5*z ==5;
sol = solve(eq1, eq2, x, y);
sol.x
sol.y
Как видите, z
опущено в выражении решения, что означает, что оно будет рассматриваться как параметр
Решение
sol.x = 13/2 - 7*z
sol.y = 3/2 - 2*z
- Из решения видно, что
x, y and z
не являются числовыми
значения, поэтому вы не можете использовать vpasolve
, который
обозначает Variable-precision arithmetic
. vpasolve дает
точность численного решения
- Также, поскольку
x, y and z
не являются числовыми значениями, вы не можете предопределить
диапазон для них, если вы не исправите z
first
Вы можете использовать solve
для просмотра набора решений, здесь я рассматриваю phi1
для параметра, поэтому опускаю его в выражении решения
syms x y z theta1 theta2 theta3 phi1
xEquation = 2 == cos(theta1)*cos(phi1) + cos(theta1 + theta2)*cos(phi1) + cos(theta1 + theta2 + theta3)*cos(phi1);
yEquation = 1.5 == cos(theta1)*sin(phi1) + cos(theta1 + theta2)*sin(phi1) + cos(theta1 + theta2 + theta3)*sin(phi1);
zEquation = 0 == sin(theta1) + sin(theta1 + theta2) + sin(theta1 + theta2 + theta3);
sol = solve(xEquation, yEquation, zEquation, theta1, theta2, theta3);
Набор решений
sol.theta1 = [-pi*(2*n - 1); pi*(2*m + 1); pi*k; pi*k]
sol.theta2 = [pi*(2*m + 1); -pi*(2*n - 1); -pi*(2*n - 1); z]
sol.theta3 = [pi*k; pi*k; pi*(2*m + 1); pi*(2*m + 1)]
phi1 is the parameter
Первый набор решений
X = [sol.theta1(1); sol.theta2(1); sol.theta3(1); phi1]
X = [-pi*(2*n - 1); pi*(2*m + 1); pi*k; phi1]
В соответствии с вышеуказанными вычетами написано 4 комплекта
z
- параметр, k, m, n
- целые числа, которые в основном
используется для периодичности тригонометрических функций
Если вы установите z
в диапазоне [-pi, pi]
, вы можете настроить k, m and n
на
получить правильное решение в диапазоне [-pi, pi]
.
Как видите, время стоит
Использование fmincon
- В качестве альтернативы вы можете использовать fmincon для решения вашей проблемы
- Я в основном минимизирую постоянную функцию, fmincon просто выдаст
решения, которые удовлетворяют ограничениям, здесь
ceq = 0
- Интервал поиска
[-pi pi]
преобразуется в lb = -pi
и
ub = pi
- Я установил начальное предположение на
0
Код следующий
t = 0:0.1:1;
x = 1.5 + 0.5 .* cos(8 .* pi .* t);
y = 1.5 + 0.5 .* sin(8 .* pi .* t);
z = 1 .* t .* ones(size(x));
lb = -pi*ones(1, 4);
ub = -lb;
p0 = zeros(1,4);
sol = cell(1,length(t));
for i = 1:length(t)
sol{i} = fmincon(@(p)0,p0,[],[],[],[],lb,ub,@(p)nonlincon(x(i),y(i), z(i), p(1), p(2), p(3), p(4)));
end
function [c, ceq] = nonlincon(x,y, z, theta1, theta2, theta3, phi1)
c = [];
ceq(1) = cos(theta1)*cos(phi1) + cos(theta1 + theta2)*cos(phi1) + cos(theta1 + theta2 + theta3)*cos(phi1)-x;
ceq(2) = cos(theta1)*sin(phi1) + cos(theta1 + theta2)*sin(phi1) + cos(theta1 + theta2 + theta3)*sin(phi1)-y;
ceq(3) = sin(theta1) + sin(theta1 + theta2) + sin(theta1 + theta2 + theta3)-z;
end
Решение
Второй набор решений, когда t = 0.1
равен sol{2}
sol{2}.(1) = pheta1
sol{2}.(2) = pheta2
sol{2}.(3) = pheta3
sol{2}.(4) = phi1
Вы можете следовать той же логике, чтобы найти решение в разное время t
Целое решение
![enter image description here](https://i.stack.imgur.com/Mbeuu.jpg)