课程实验报告
课程名称
数值分析 班级
实验日期 2008 年 9 月 30 日
姓名
实验名称
学号
实验成绩
实验三 非线性方程求解
实
验
目
的
及
要
求
实
验
环
境
实
验
内
容
实验目的: 掌握二分法与牛顿法的基本原理及应用。
实验要求:
1.用二分法计算方程
在 (1, 2) 内的根的近似值
2.用迭代法计算方程
sin
x
2
x
2
0
3
x
x
1 0
在 (1, 1.5) 内的根的近似值
(
Windows xp 操作系统
VC++6.0
5
0.5 10 )
。
f x 在[ , ]a b 上连续, ( )
f a f b 且 ( )
( ) 0
f c ,则 c 恰为其根,否则,根据 ( )
1.二分法:
假定 ( )
f x 在 ( , )a b 内仅有一实根
*x 取区间中点 c ,若 ( ) 0
( ) 0
是否成立,可判断出根所属的新的有根子区间 ( , )a c 或 ( , )c b ,为节省
内存,仍称其为 ( , )a b 。运算重复进行,直到满足精度要求为止,即
|
c
2.迭代法:
0x 为初始猜测,则由递推关系
。式中 ,a b 为新的有根子区间的端点。
|
f a f c
b a
*
x
x
k
1
x
k
(
f x
k
(
f x
k
)
)
产生逼近解 *x 的迭代序列{ }kx ,这个递推公式就是 Newton 法。当 0x 距
*x 较近时,{ }kx 很快收敛于 *x 。但当 0x 选择不当时,会导致{ }kx 发散。
故我们事先规定迭代的最多次数。若超过这个次数,还不收敛,则停
止迭代另选初值。
实验步骤:
1、程序设计
2、计算实例
3、撰写实验报告
1、实验 1 的运行结果如图
算
法
描
述
及
实
验
步
骤
调
试
过
程
及
实
验
结
果
2、实验 2 的运行结果如图:
图一
图二
总
结
附
录
通过本次实验,加深了我对用二分法和迭代法求解非线性方程组
的理解。使我不仅掌握了它们的基本原理,而且能够熟练地应用它们
来解决实际问题。二分法与牛顿法是非常常用的求解方程组的方法,
很多实际问题通过建模都可以转化为类似的求解方程组的问题,所以
我们应该熟练掌握这两种方法,为以后能方便的解决实际问题做铺
垫。
Newton 法是一种行之有效的迭代法,在单根附近有较高的收敛
速度。但是 Newton 法的关键在于选取足够精确的初值,如果初值选
取不当,则此方法可能会发散。
源程序清单
1. 二分法
#include
#include
#include
using namespace std;
float Fangcheng(float x);
void main()
{
float a,b;
int n = 0;
char A;
do{
cout<<"计算如下: "<>a;
cout<<"请输入 b 的值:";
cin>>b;
cout<<"结果如下所示:"<}
else
{
}
a = m;
}
else
n++;
break;
printf("%d\t%2.10lf\t%2.10lf\t%2.10lf\t%2.10lf\n",n,a,b,(a+b)/2,Fan
gcheng((a+b)/2));
}
printf("\n 总 共 进 行 了 10 次 二 分 , 方 程 的 近 似 解 是 : x
≈%2.10lf",(a+b)/2);
cout<<"\n 你还想重新进行计算吗?请按 Y 或 y 重新开始,其他键
退出。"<>A;
}while(A=='Y'||A=='y');
}
float Fangcheng(float x)
{
float y = 0;
y = sin(x) - x*x/2;
return y;
}
2、迭代法
#include
#include
#include
using namespace std;
float Cuberoot(float x);
void main()
{
float Xa;
char A;
do{
cout<<"请输入 Xa 的值:";
cin>>Xa;
float Xb = Cuberoot(Xa+1);
int k = 0;
k\t\tx\t\t\n");
cout<<"计算过程如下: "<0.00005)
{
k++;
Xa= Xb;
Xb = Cuberoot(Xa+1);
printf(" %d\t%15.10lf\n",k,Xb);
}
printf("\n 总共进行%d 次迭代,结果为:x≈%.10f\n",k,Xb);
cout<<"你还想重新进行计算吗?请按 Y 或 y 重新开始,其他键退
出"<>A;
}while(A=='Y'||A=='y');
float Cuberoot(float x)
{
return(pow(x,1.0/3));
}
}