假设需要求解的非线性方程组为
x(1)^2 + x(2)^2 - 25=0;
x(1) - x(2) - 1=0;
exp(x(1)) + x(2) - 7=0;
x(1) + 2*x(2)=0;
采用牛顿迭代法求解
initialGuess = [0, 0];
tolerance = 1e-6;
solution = newtonRaphson(@equations, initialGuess, tolerance);
disp('解:');
disp(['x = ', num2str(solution(1))]);
disp(['y = ', num2str(solution(2))]);
function F = equations(x)
F = [x(1)^2 + x(2)^2 - 25;
x(1) - x(2) - 1;
exp(x(1)) + x(2) - 7
x(1) + 2*x(2)];
end
function solution = newtonRaphson(equations, initialGuess, tolerance)
maxIterations = 1000;
x = initialGuess;
iteration = 1;
while iteration <= maxIterations
F = equations(x);
J = jacobian(equations, x);
delta_x = J \ (-F); % 使用左除法求解线性方程组 J * delta_x = -F
x = x + delta_x;
if norm(delta_x, inf) < tolerance
solution = x;
return;
end
iteration = iteration + 1;
end
error('牛顿迭代法未收敛到解');
end
function J = jacobian(equations, x)
numEquations = length(equations(x));
numVariables = length(x);
J = zeros(numEquations, numVariables);
h = 1e-8; % 微小的增量
for i = 1:numVariables
x1 = x;
x2 = x;
x1(i) = x1(i) + h;
x2(i) = x2(i) - h;
J(:, i) = (equations(x1) - equations(x2)) / (2 * h);
end
end
解:
x = 2.48
y = -4.1079