《计算方法》
实验报告
二级学院: 计算机学院
专 业: 计算机科学与技术
指导教师: 爨莹
班级学号: 201107010122
姓 名: 张文江
实验一 非线性方程的迭代数值解法
实验目的:
① 通过编程和插值与拟合中的某种具体算法解决具体问题,更深一步
的体会计算方法这门课的重要性,同时加深对插值与拟合公式某种具体算法
的理解。
② 熟悉编程环境。
2、实验要求:
实现插值与拟合中的某种具体算法编写并执行
3、实验内容:
1)用牛顿法求解01553x的根,取初始值为10。
2) 用弦截法求解数学方程,()^310fxxx在[1,1.5]内的根。
4、题目:
1)用牛顿法求解01553x的根,取初始值为10。
2) 用弦截法求解数学方程,()^310fxxx在[1,1.5]内的根
5、原理:
编程实现牛顿法、弦截法求非线性方程的根。
(1)牛顿法
x1=(x0-f/f1);
(2)单点弦截法
x2=x0-f0*(xn-x0)/(fn-f0);
6、设计思想:
(1)牛顿法
首先找到初始值,将初始值带入到方程中,计算一次求导和二次求导的值,确
定x0和x1的值,然后利用循环x1=(x0-f/f1),条件为(x0-x1)>1e-6,循环一
次的x1的值给x0;直到找到符合的x1为止。
(2)单点弦截法
首先找到初始值,将初始值带入到方程中,计算一次求导和二次求导的值,确
定x0和x1的值,然后利用循环x2=x0-f0*(x1-x0)/(f1-f0);,条件为
(x0-x1)>1e-6, 循环一次的x2的值给x1;直到找到符合的x2为止。
7、对应程序:
(1)牛顿法:
#include
#include
float f(float a,float b,float c,float d,float x)
{
float f;
f=a*x*x*x+b*x*x+c*x+d;
return f;
}
float f1(float a,float b,float c,float x)
{
float f1;
f1=(x*3*a+2*b)*x+c;
return f1;
}
float root(float a,float b,float c,float d)
{
float x0,x1=6;
do
{
x0=x1;
x1=x0-f(a,b,c,d,x0)/f1(a,b,c,x0);
}while(fabs(x1-x0)>=1e-6);
return x0;
}
void main()
{
float a,b,c,d,x;
printf("input four float numbers:\n");
scanf("%f%f%f%f",&a,&b,&c,&d);
x=root(a,b,c,d);
printf("%.1fX^3+%.1fX^2+%.1fX+%.1f=0 its root near x=1.5
is :%.3f\n",a,b,c,d,x);
}
(2)迭代法:
#include
#include
void main()
{
float f(float x);
float root(float x1, float x2);
float xpoint(float x1,float x2);
float x1,x2,f1,f2,x;
do
{
printf("input x1,x2:\n");
scanf("%f,%f",&x1,&x2);
f1=f(x1);
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);
printf("A root of equation is %.3f\n",x);
}
float root(float x1, float x2)
{
float xpoint(float x1,float x2);
float f(float x);
float x,y,y1;
y1=f(x1);
do
{
x=xpoint(x1,x2);
y=f(x);
if(y*y1>0)
{
y1=y;
x1=x;
}else
x2=x;
}while(fabs(y)>=0.0001);
return (x);
}
float f(float x)
{
float y;
y=x*x*x-x-1;
return (y);
}
float xpoint(float x1,float x2)
{
float y;
y=(x1*f(x2)-x2*f(x1)) / (f(x2) - f(x1));
return (y) ;
}
8、实验结果:
(1)牛顿法结果:
X=5.372
(2)迭代法结果
X=1.325
9、图形
(1)
(2)
10、
实验体会:
通过编程,切身感到计算方法这门课绝不仅仅是数学,是图形的
观察和实际计算方法的应用,从而解决一些复杂的数值问题。