非线性方程的数值解法

一、数学原理
1输入初值,最大迭代次数Nmax,和精度要求Eps,设置i:=0;
2 计算X(K+1)=X(K)-f(Xk)/f(Xk)
3 若|X(K+1)-X(K)<EPS|,然后停止运算
4 若i=Nmax,则停止运算,否则i:=i+1,转向步骤2
二、实验内容
用Newton法求方程的一个实根近似解,已知该实根在3附近。分别取初值x0=[0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6],用牛顿法计算近似根,统计对应的迭代次数,并画出初值与迭代次数的关系图-柱状图。要求编写程序进行计算,用误差估计e≤10−6和最大迭代次数Nmax=500来控制迭代次数。
本实验可能用到的函数或方法列表:

名称 diff subs length fprintf bar axis
功能 求导 符号计算 计算向量长度 格式输出 绘制直方图 设置坐标轴范围

代码部分:

format compact
clc,clear
fname = @(x)(x^3-2*x^2-4*x-7);
dfname = @(x)(3*x^2-4*x-4);
i=1;
x0=[];
kl=[];
for j=0:0.5:6
    [x_star,k]=Newton(fname,dfname,j);
    x0(i)=j;
    kl(i)=k;
    i=i+1;
end
fprintf('Newton法解方程的根为: %.3f \n',x_star);
fprintf('初  值: %.1f   %.1f   %.1f   %.1f   %.1f   %.1f   %.1f   %.1f   %.1f   %.1f   %.1f   %.1f   %.1f \n',x0);
fprintf('次  数: %.0f     %.0f     %.0f     %.0f     %.0f     %.0f     %.0f     %.0f     %.0f     %.0f     %.0f     %.0f     %.0f \n',kl);
bar(x0,kl);

function [x_star,k]=Newton(fname,dfname,x0,ep,Nmax)
% 用Newton法解非线性方程f(x)=0
% fname和dfname分别表示f(x)及其导数的M函数句柄或内嵌函数X0为迭代初值
% ep为精度(默认值为1e-5),x返回解, k为迭代次数上限 (默认500)
if nargin<5 
    Nmax=500;
end
if nargin<4 
    ep=1e-5;
end
x=x0;x0=x+2*ep;k=0;
while abs(x0-x)>ep&&k<Nmax 
    k=k+1;
    x0=x;
    x=x0-feval(fname,x0)/feval(dfname,x0); 
end
x_star=x;
if k==Nmax 
  warning('已迭代上限次数');
end
end

猜你喜欢

转载自blog.csdn.net/m0_55726741/article/details/129194638