数值分析大作业 三四五六七

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

大作业 三

1. 给定初值0x 及容许误差 ,编制牛顿法解方程f (x )=0的通用程序.

解:Matlab 程序如下:

函数m 文件:fu.m

function Fu=fu(x)

Fu=x^3/3-x;

end

函数m 文件:dfu.m

function Fu=dfu(x)

Fu=x^2-1;

end

用Newton 法求根的通用程序Newton.m

clear;

x0=input('请输入初值x0:');

ep=input('请输入容许误差:');

flag=1;

while flag==1

x1=x0-fu(x0)/dfu(x0);

if abs(x1-x0)

flag=0;

end

x0=x1;

end

fprintf('方程的一个近似解为:%f\n',x0);

寻找最大δ值的程序:Find.m

clear

eps=input('请输入搜索精度:');

ep=input('请输入容许误差:');

flag=1;

k=0;

x0=0;

while flag==1

sigma=k*eps;

x0=sigma;

k=k+1;

m=0;

flag1=1;

while flag1==1 && m<=10^3

x1=x0-fu(x0)/dfu(x0);

if abs(x1-x0)

flag1=0;

end

m=m+1;

x0=x1;

end

if flag1==1||abs(x0)>=ep

flag=0;

end

end

fprintf('最大的sigma 值为:%f\n',sigma);

2.求下列方程的非零根

5130.6651()ln 05130.665114000.0918

x x f x x +⎛⎫=-= ⎪-⨯⎝⎭解:Matlab 程序为:

(1)主程序

clear

clc

format long

x0=765;

N=100;

errorlim=10^(-5);

x=x0-f(x0)/subs(df(),x0);

n=1;

while n

x=x0-f(x0)/subs(df(),x0);

if abs(x-x0)>errorlim

n=n+1;

else

break ;

end

x0=x;

end

disp(['迭代次数: n=',num2str(n)])

disp(['所求非零根: 正根x1=',num2str(x),' 负根x2=',num2str(-x)])

(2)子函数 非线性函数f

function y=f(x)

y=log((513+0.6651*x)/(513-0.6651*x))-x/(1400*0.0918);

end

(3)子函数非线性函数的一阶导数df

function y=df()

syms x1

y=log((513+0.6651*x1)/(513-0.6651*x1))-x1/(1400*0.0918); y=diff(y);

end

运行结果如下:

迭代次数: n=5

所求非零根: 正根x1=767.3861 负根x2=-767.3861

大作业 四

试编写MATLAB 函数实现Newton 插值,要求能输

出插值多项式. 对函数21()14f x x

=+在区间[-5,5]上实现10次多项式插值.

分析:(1)输出插值多项式。 (2)在区间[-5,5]内均匀插入99个节点,计算这些节点上函数f (x )的近似值,并在同一张图上画出原函数和插值多项式的图形。 (3)观察龙格现象,计算插值函数在各节点处的误差,并画出误差图。

解:Matlab 程序代码如下:

%此函数实现y=1/(1+4*x^2)的n 次Newton 插值,n 由调用函数时指定

%函数输出为插值结果的系数向量(行向量)和插值多项式

function [t y]=func5(n)

x0=linspace(-5,5,n+1)';

y0=1./(1.+4.*x0.^2);

b=zeros(1,n+1);

for i=1:n+1

s=0;

for j=1:i

t=1;

for k=1:i

if k~=j

t=(x0(j)-x0(k))*t;

end ;

end ;

s=s+y0(j)/t;

end ;

b(i)=s;

end ;

t=linspace(0,0,n+1);

for i=1:n

s=linspace(0,0,n+1);

s(n+1-i:n+1)=b(i+1).*poly(x0(1:i));

t=t+s;

end ;

t(n+1)=t(n+1)+b(1);

y=poly2sym(t);

10次插值运行结果:

[b Y]=func5(10)

相关文档
最新文档