matlab 编制两个 M 函数求解求方程f(x)=0的一个根的通用程序使用牛顿法算法和割线法函数,并用编制的函数求根f(x)=x^2-2,同一图显示两种方法,画出每步残差与选代步的关系图,其中横坐标:迭代步 (iter)纵坐标:误差(res)添加标题、坐标轴标签、文本注释对象)。
时间: 2024-03-13 13:45:58 浏览: 65
MATLAB用于方程求根
好的,以下是 Matlab 代码:
首先是牛顿法的 M 函数代码:
```matlab
function [x,iter,res] = newton(f,df,x0,tol,maxiter)
% 牛顿法求解 f(x) = 0 的根
% 输入:
% f: 目标函数
% df: 目标函数的导数
% x0: 初始猜测值
% tol: 容忍误差
% maxiter: 最大迭代次数
% 输出:
% x: 迭代得到的解
% iter: 迭代次数
% res: 每一步的残差
iter = 0;
res = [];
while iter < maxiter
fx = f(x0);
dfx = df(x0);
x = x0 - fx/dfx;
r = abs(x - x0);
res = [res, r];
if r < tol
break;
end
x0 = x;
iter = iter + 1;
end
if iter == maxiter
fprintf('Warning: Maximum iteration reached!\n');
end
end
```
然后是割线法的 M 函数代码:
```matlab
function [x,iter,res] = secant(f,x0,x1,tol,maxiter)
% 割线法求解 f(x) = 0 的根
% 输入:
% f: 目标函数
% x0,x1: 初始猜测值
% tol: 容忍误差
% maxiter: 最大迭代次数
% 输出:
% x: 迭代得到的解
% iter: 迭代次数
% res: 每一步的残差
iter = 0;
res = [];
while iter < maxiter
fx0 = f(x0);
fx1 = f(x1);
x = x1 - fx1*(x1-x0)/(fx1-fx0);
r = abs(x - x1);
res = [res, r];
if r < tol
break;
end
x0 = x1;
x1 = x;
iter = iter + 1;
end
if iter == maxiter
fprintf('Warning: Maximum iteration reached!\n');
end
end
```
接下来是主程序的 M 代码:
```matlab
% 目标函数及其导数
f = @(x) x^2 - 2;
df = @(x) 2*x;
% 求解
x0 = 1;
x1 = 2;
tol = 1e-8;
maxiter = 100;
% 牛顿法
[xn, iter_n, res_n] = newton(f, df, x0, tol, maxiter);
% 割线法
[xs, iter_s, res_s] = secant(f, x0, x1, tol, maxiter);
% 绘图
figure;
hold on;
plot(0:iter_n, [abs(f(x0)), res_n], '-o', 'LineWidth', 1.5, 'MarkerSize', 6);
plot(0:iter_s, [abs(f(x0)), res_s], '-s', 'LineWidth', 1.5, 'MarkerSize', 6);
xlabel('迭代步 (iter)', 'FontSize', 12);
ylabel('误差 (res)', 'FontSize', 12);
title('牛顿法和割线法求解方程f(x)=0', 'FontSize', 14);
legend('牛顿法', '割线法', 'FontSize', 12);
text(5, 1.5, sprintf('xn = %f\nxs = %f', xn, xs), 'FontSize', 12);
hold off;
```
运行该程序,会得到一个包含两种方法的误差-迭代步数关系图,以及最终解的数值。图形中的横坐标为迭代步数,纵坐标为误差。注释中的文字说明了所用方法和最终解的数值。
阅读全文