Хранение ньютоновских итераций в массиве - PullRequest
0 голосов
/ 19 мая 2019

Я написал функцию в Matlab, которая применяет метод Ньютона к данной системе уравнений и ее якобиану. Вектор x, который приближается к пересечению двух функций, заданных в системе уравнений, сохраняется следующим образом:

2.06733483062522    -0.615946742374531
2.25465524043858    -0.428626332561163
1.13788162420748    -1.54539994879227
1.32520203402085    -1.35807953897890
0.802454971005455   -1.88082660199429
0.989775380818824   -1.69350619218092
0.743382354827609   -1.93989921817214
0.930702764640978   -1.75257880835877
0.741429028102197   -1.94185254489755
0.928749437915565   -1.7545321350841

здесь

 x1 = [2.06733~ ; 2.25465~]

и, таким образом, они хранятся вертикально, но я хочу, чтобы они располагались горизонтально друг под другом. Любая помощь приветствуется

Я пытался извлечь значения в цикле for, используя четные и нечетные записи, но для системы уравнений более высокого порядка это не сработало бы.

% INPUT
% f root function (may be vector valued )
% df derivative of f (or function returning Jacobian matrix )
% x0 initial guess
% tol desired tolerance
% maxIt maximum number of iterations
%
% OUTPUT
% x approximate solution
% success true means converged according to error estimator
% errEst error estimate per iteration
% xHist ( optional ) array with intermediate solutions

function [x, success , errEst, xHist ] = newton (f, df, x0 , tol , maxIt )
errEst = []; xHist = [];
for k = 1:1:size(f)

iter = 0; err = inf; x = x0; success = false;


while err > 0 && iter < maxIt
      Fun = f{k}(x);
      Jac = df{k}(x);
      delta = -Jac\Fun;
      err = norm(delta);
      x = x + delta;
      errEst = [errEst; err];
      xHist = [xHist; x];
      iter = iter + 1;
end
end
if err < tol
    success = true;
end

end

это называется так:

x0 = 1/sqrt(2) * [2;1]; grad = [sqrt(2)/2;sqrt(2)]; n = grad/norm(grad); t = [n(2),-n(1)]; p = 0.5;
x0 = x0 + 2 * (n+t); %x0 = x0 - 2 * (n+t);
f = {@(x)(x(1)/2)^2 + x(2)^2 - 1, @(x)n .* (x - x0) - p - 0.5 .* (t .* (x - x0)) .^ 2};
df = {@(x)x(1)/2 + 2 * x(2), @(x)n - t .* (t .*(x - x0))};
[x, success , errEst , xHist ] = newton(f, df, x0 , 10^(-12) , 20);
...