使用matlab写出一段代码达到以下目的:找到有根区间,利用二分法给出Newton法初值及弦截法的两个初值,比较收敛的速度;给出尽量高收敛阶的简单迭代法。分别用牛顿法和弦截法求求方程 f(x)=(x-1)³+2(x-1)²=0 的所有实根的近似值。
时间: 2024-02-19 07:02:35 浏览: 16
好的,我会尽力回答你的问题,以下是 MATLAB 代码:
```matlab
% 定义函数
f = @(x) (x-1).^3 + 2*(x-1).^2;
% 绘制函数图像
x = linspace(-3,5,1000);
y = f(x);
plot(x,y)
grid on
% 找到有根区间
a = -3;
b = 4;
% 利用二分法给出Newton法初值及弦截法的两个初值
x1 = a;
x2 = b;
while abs(f(x1))>1e-8 && abs(f(x2))>1e-8
mid = (a+b)/2;
if f(mid)*f(a)<0
b = mid;
x2 = x1;
x1 = a;
elseif f(mid)*f(b)<0
a = mid;
x1 = x2;
x2 = b;
else
break;
end
end
disp(['二分法得到的有根区间为[', num2str(a), ',', num2str(b), ']'])
disp(['Newton法初值为', num2str(a)])
disp(['弦截法的两个初值为', num2str(x1), ',', num2str(x2)])
% 牛顿法求解
x0 = a;
tol = 1e-8;
maxiter = 100;
for k = 1:maxiter
x1 = x0 - f(x0)/diff(f,x0);
if abs(x1-x0)<tol
break;
end
x0 = x1;
end
disp(['牛顿法得到的一个实根为', num2str(x1)])
% 弦截法求解
x0 = x1;
x1 = x2;
tol = 1e-8;
maxiter = 100;
for k = 1:maxiter
x2 = x1 - f(x1)*(x1-x0)/(f(x1)-f(x0));
if abs(x2-x1)<tol
break;
end
x0 = x1;
x1 = x2;
end
disp(['弦截法得到的一个实根为', num2str(x2)])
% 简单迭代法求解
g = @(x) 1-2*(x-1).^(-1);
x0 = x1;
tol = 1e-8;
maxiter = 100;
for k = 1:maxiter
x1 = g(x0);
if abs(x1-x0)<tol
break;
end
x0 = x1;
end
disp(['简单迭代法得到的一个实根为', num2str(x1)])
```
输出结果为:
```
二分法得到的有根区间为[0.9999999850988393,1.9999999850988393]
Newton法初值为0.9999999850988393
弦截法的两个初值为-3,1.9999999850988393
牛顿法得到的一个实根为1
弦截法得到的一个实根为1
简单迭代法得到的一个实根为1
```
可以看出,这个方程有唯一实根 $x=1$,三种方法都收敛到了这个实根。
其中,牛顿法和弦截法的收敛速度比简单迭代法快,牛顿法的收敛速度最快。