假设我有这组方程:
其中,和。和的值假设 x 和 y 都不能小于零,我如何稳健地解决这个系统?我尝试了 Newton-Raphson 方法并得到了以下残差和雅可比:
这是MATLAB代码:
% User-defined inputs
a = 1;
b = 0;
k0 = 10;
% Initial guess
%u = [1;1;1];
u = rand(3,1)*2;
% Newton-Raphson solver
i = 0; max_iters = 30; TOL = 1e-12;
fprintf('a = %f\nb = %f\nk0 = %f\nInitial guess: (%f,%f,%f)\n\n\tResidual_x\tResidual_y\tResidual_z\tResidual_rel\n',a,b,k0,u(1),u(2),u(3));
while (true)
% Residual function
F = [u(1)+u(3)-a;u(2)+0.5*u(3)-b;k0*u(1)*sqrt(u(2))-u(3)];
% Initial residual
if i == 0
R_init = norm(F);
% Maximum iterations
elseif i == max_iters
fprintf('\tSolution did not converge.\n');
break;
end
% Absolute residual
R = norm(F);
% Relative residual
R_rel = R/R_init;
fprintf('\t%e\t%e\t%e\t%e)\n',norm(F(1)),norm(F(2)),norm(F(3)),R_rel);
% Check for convergence
if (R_rel < TOL)
fprintf('\tConverged.\n');
break;
end
% Jacobian matrix
J = [1,0,1;0,1,0.5;u(1)*k0*sqrt(u(2)),0.5*k0*u(1)/sqrt(u(2)),-1];
% Solve and update
u = u-J\F;
i = i + 1;
end
fprintf('\nF
似乎这并不总是有效。例如,如果在 iterate我有,则求解器会爆炸(因为会导致错误)。最初的猜测似乎也发挥了重要作用,因为如果您使用随机猜测运行上述代码,每次都会得到不同的解决方案。
也就是说,我还能如何(或更好地)解决我上面的问题?或者如果我坚持这个 Newton-Raphson 方案,我应该如何选择我的初始猜测?