Рассмотрим следующую проблему:
Я сейчас в третьей части этого вопроса. Я написал уравнения векторной петли (q=teta2
, x=teta3
и y=teta4
):
fval(1,1) = r2*cos(q)+r3*cos(x)-r4*cos(y)-r1;
fval(2,1) = r2*sin(q)+r3*sin(x)-r4*sin(y);
У меня есть эти 2 функции, и даны все переменные, кроме x
и y
. Я нашла корни с помощью этого видео.
Теперь мне нужно построить графики зависимости q
от x
и q
от y
, когда q
находится в [0,2pi]
с дельтой q 2,5 градуса. Что нужно сделать, чтобы построить графики?
Ниже моя попытка до сих пор:
function [fval,jac] = lorenzSystem(X)
%Define variables
x = X(1);
y = X(2);
q = pi/2;
r2 = 15
r3 = 50
r4 = 45
r1 = 40
%Define f(x)
fval(1,1)=r2*cos(q)+r3*cos(x)-r4*cos(y)-r1;
fval(2,1)=r2*sin(q)+r3*sin(x)-r4*sin(y);
%Define Jacobian
jac = [-r3*sin(X(1)), r4*sin(X(2));
r3*cos(X(1)), -r4*cos(X(2))];
%% Multivariate NR
%Initial conditions:
X0 = [0.5;1];
maxIter = 50;
tolX = 1e-6;
X = X0;
Xold = X0;
for i = 1:maxIter
[f,j] = lorenzSystem(X);
X = X - inv(j)*f;
err(:,i) = abs(X-Xold);
Xold = X;
if (err(:,i)<tolX)
break;
end
end
Какой ввод X
? У вас есть иллюстрация ожидаемого результата?
Добавляю картинку вопроса.
Это хорошее дополнение, но оно не отвечает на мой вопрос :( Знаете ли вы, как должны выглядеть диаграммы q vs x и q vs y? Какова связь между вводом функции X
и иллюстрацией, которую вы только что добавили? ?
Извини за это. Я забыл ответить на ваш вопрос. Я не знаю, как именно должны выглядеть графики. Но это похоже на то, что изменение значения teta2 изменит два других угла. Я думаю, что графики выглядят как солнечные волны, но я не уверен.
Пожалуйста, взгляните на мое решение ниже и изучите, чем оно отличается от вашего.
function [th2,th3,th4] = q65270276()
[th2,th3,th4] = lorenzSystem();
hF = figure(); hAx = axes(hF);
plot(hAx, deg2rad(th2), deg2rad(th3), deg2rad(th2), deg2rad(th4));
xlabel(hAx, '\theta_2')
xticks(hAx, 0:pi/3:2*pi);
xticklabels(hAx, {'$0$','$\frac{\pi}{3}$','$\frac{2\pi}{3}$','$\pi$','$\frac{4\pi}{3}$','$\frac{5\pi}{3}$','$2\pi$'});
hAx.TickLabelInterpreter = 'latex';
yticks(hAx, 0:pi/6:pi);
yticklabels(hAx, {'$0$','$\frac{\pi}{6}$','$\frac{\pi}{3}$','$\frac{\pi}{2}$','$\frac{2\pi}{3}$','$\frac{5\pi}{6}$','$\pi$'});
set(hAx, 'XLim', [0 2*pi], 'YLim', [0 pi], 'FontSize', 16);
grid(hAx, 'on');
legend(hAx, '\theta_3', '\theta_4')
end
function [th2,th3,th4] = lorenzSystem()
th2 = (0:2.5:360).';
[th3,th4] = deal(zeros(size(th2)));
% Define geometry:
r1 = 40;
r2 = 15;
r3 = 50;
r4 = 45;
% Define the residual:
res = @(q,X)[r2*cosd(q)+r3*cosd(X(1))-r4*cosd(X(2))-r1; ... Δx=0
r2*sind(q)+r3*sind(X(1))-r4*sind(X(2))]; % Δy=0
% Define the Jacobian:
J = @(X)[-r3*sind(X(1)), r4*sind(X(2));
r3*cosd(X(1)), -r4*cosd(X(2))];
X0 = [acosd((45^2-25^2-50^2)/(-2*25*50)); 180-acosd((50^2-25^2-45^2)/(-2*25*45))]; % Accurate guess
maxIter = 500;
tolX = 1e-6;
for idx = 1:numel(th2)
X = X0;
Xold = X0;
err = zeros(maxIter, 1); % Preallocation
for it = 1:maxIter
% Update the guess
f = res( th2(idx), Xold );
X = Xold - J(Xold) \ f;
% X = X - pinv(J(X)) * res( q(idx), X ); % May help when J(X) is close to singular
% Determine convergence
err(it) = (X-Xold).' * (X-Xold);
if err(it) < tolX
break
end
% Update history
Xold = X;
end
% Unpack and store θ₃, θ₄
th3(idx) = X(1);
th4(idx) = X(2);
% Update X0 for faster convergence of the next case:
X0 = X;
end
end
Несколько примечаний:
Все расчеты производятся в градусах.
Конкретный код построения графика, который я использовал, менее интересен, важно то, что я определил все θ₂
заранее, а затем зациклился на них, чтобы найти θ₃
и θ₄
(без рекурсии, как это было сделано в вашей собственной реализации).
Исходное предположение (собственно, аналитическое решение) для самого первого случая (θ₂=0
) можно найти, решив задачу вручную (т.е. «на бумаге») по закону косинусов . Решатель также работает для других предположений, но вам может потребоваться увеличить maxIter
. Кроме того, для некоторых предположений (например, X(1)==X(2)
) якобиан плохо обусловлен, и в этом случае вы можете использовать pinv.
Если мои вычисления верны, это результат:
Не могли бы вы опубликовать код/попытку, которая у вас есть? Это может помочь нам понять, что именно вы пытаетесь заговорить.