计算方法实验报告4
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算方法实验报告(四)
(一)线性方程的迭代解法
一、实验问题
利用简单迭代法,两种加速技术,牛顿法,改进牛顿法,弦割法求解习题5-1,5-2,5-3中的一题,并尽可能准确。
选取5-3:求在x=1.5附近的根。
二、问题的分析(描述算法的步骤等)
(1)简单迭代法算法:
给定初始近似值,求的解。
Step 1 令i=0;
Step 2 令(计算);
Step 3 如果,则迭代终止,否则重复Step 2。
(2)Aitken加速法算法
Step 1 令k=0,利用简单迭代算法得到迭代序列;
Step 2 令-(计算得到一个新的序列,其中k=0,1,2…);Step 3 如果,则迭代终止,否则重复Step 2。
(3)插值加速法算法
Step 1 令k=0,利用简单迭代算法得到迭代序列;
Step 2 令+(计算得到一个新的序列,其中k=1,2,3…);
Step 3 如果,则迭代终止,否则重复Step 2。
(4)牛顿法算法
Step 1给定初始近似值;
Step 2令,其中k计算得到的序列;
Step 3如果,则迭代终止,否则重复Step 2。
(5)改进牛顿法的算法
Step 1给定初始近似值;
Step 2令,其中k迭代计算得到的序列;
Step 3如果,则迭代终止,否则重复Step 2。
(6)弦割法算法(双点弦割法)
Step 1给定初始近似值,;
Step 2令其中k计算得到的序列;
Step 3如果,则迭代终止,否则重复Step 2。
三、程序设计
(1)简单迭代法
利用迭代公式进行迭代运算。
#include
#include
#include
double fun(double x)
{
double c=1+x*x;
returnpow(c,1/3.0);
}
void main()
{
double x=1.5;
double y=0;
double D=1;
double e=0.001;
while(D>e)
{
D=0;
y=fun(x);
if(fabs(y-x)>=D)
{
D=fabs(y-x);
}
x=y;
}
cout< } (2) )Aitken加速法源程序如下:x1=1.5; eps=0.0001; y1=(1+x1^2)^(1/3); z1=(1+y1^2)^(1/3); x=z1-(z1-y1)^2/(z1-2*y1+x1); while eps x=x2; x1=y1; y1=(1+x1^2)^(1/3); z1=(1+y1^2)^(1/3); x2=z1-(z1-y1)^2/(z1-2*y1+x1); n=n+1; end fprintf('迭代次数 n=%.0f\n',n); fprintf('x2=%.5f\n',x2) (3)插值加速法源程序如下: x1=0; x2=1.5; eps=0.0000001; y1=0; z1=0; n=0; while eps x1=x2; y1=(1+x1^2)^(1/3); z1=(1+y1^2)^(1/3); x2=z1+(z1-y1)^2/(z1-2*y1+x1); n=n+1; end fprintf('迭代次数 n=%.0f\n',n); fprintf('x2=%.5f\n',x2) (4)牛顿法: 利用公式进行迭代运算 程序设计如下: #include #include double fun(double x) { double a=2*pow(x,3.0)-pow(x,2.0)+1; double b=3*pow(x,2.0)-2*x; return a/b; } void main() { double x=1.5; double y=0; double D=1; double e=0.001; double f=0; while(D>e) { D=0; y=fun(x); if(fabs(y-x)>=D) { D=fabs(y-x); } x=y; f++; } cout< cout<<"f="< } (5)运用改进牛顿法: 迭代公式: 程序代码如下: #include #include double fun(double x) { double a=2*pow(x,3.0)-pow(x,2.0)+1; double b=3*pow(x,2.0)-2*x;