...0在区间[3,4]上的近似根。且满足精度|x*-xk|<(1/2)*10^-4_百度...
发布网友
发布时间:2024-01-17 03:17
我来回答
共1个回答
热心网友
时间:2024-06-12 13:24
以下保存为文件 newtonqx.m
function [k,xk,yk,piancha]=newtonqx(x0,tol,gmax)
global fnq dfnq
x(1)=x0;
for i=1:gmax
x(i+1)=x(i)-fnq(x(i))/(dfnq(x(i)+eps)); %牛顿迭代公式 x(n+1)=x(n)-f(xn)/f'(xn), 为避免除以0,加上一个eps
piancha = abs(x(i+1)-x(i)); %计算迭代精度
i=i+1;
xk=x(i); %计算下一步
yk=fnq(x(i));
if( piancha<tol ) %满足迭代精度,则结束迭代
k=i-1;
xk=x(i);
yk=fnq(x(i));
break;
end
end
if i>gmax %迭代次数超过设定,结束迭代
disp('超过最大迭代次数')
k=i-1;
xk=x(i);
yk=fnq(x(i));
%[i-1 xk yk piancha];
return;
end
以下存为文件gexian.m
function [k,xk,yk,piancha]=gexian(x01,x02,tol,gmax)
global fnq dfnq
x(1)=x01;
x(2)=x02;
for i=2:gmax
%割线法迭代公式: x(n+1)=x(n)- f(x(n))*( x(n)-x(n-1))/(f(x(n))-f(x(n-1) )
% 即用x(n),x(n-1)上的差商替代导数f'(xn)
u(i)=fnq(x(i))*(x(i)-x(i-1));
v(i)=fnq(x(i))-fnq(x(i-1));
x(i+1)=x(i)-u(i)/(v(i));
piancha=abs(x(i+1)-x(i)); %计算迭代精度
%计算下一步
i=i+1;
xk=x(i);
yk=fnq(x(i));
%是否满足精度要求,是则停止迭代
if(piancha<tol)
k=i-2;
xk=x(i);
yk=fnq(x(i));
return
end
end
以下为主程序
% 分别用牛顿法和割线法求解方程 x^3-6x^2+9x-2=0在区间[3,4]上的近似根。
% 要求满足精度|x*-xk|<(1/2)*10^-4
clc;
clear all;
% 将待求解方程及其导函数定义为全局变量,以便在子函数中引用
global fnq dfnq
fnq = @(x) x^3 - 6*x^2 + 9*x - 2; %原方程
dfnq = @(x) 3*x^2 - 12*x + 9; %导函数
tol = (1/2)*10^-4; %精度要求
x0 = 3.5; %求解起始点=区间中点
gmax = 1e3; %求解最大迭代次数
x01 = 3; %求解区间
x02 = 4;
[k,xk,yk,piancha]=newtonqx(x0,tol,gmax);
fprintf('\n牛顿法:%.5f\n', xk);
[k,xk,yk,piancha]=gexian(x01,x02,tol,gmax);
fprintf('\n割线法:%.5f\n', xk);
运行结果:
牛顿法:3.73205
割线法:3.73205