计算方法实习实验报告
-
实验一 割线法
-
实验要求(含有算法说明和程序说明)
牛顿迭代法收敛速度很快,不过每迭代一次,需要计算f(xk)和
f'(xk)如果f(xk)比较复杂则计算f'(xk)的工作量就会比较大,为了解决这个问题于是使用差商来代替函数的导数。
当经过k次迭代后,欲求xk+1。用f(x)在xk,xk+1两点的差商
来代替迭代公式(k=0,1,2,…..)中的导数值
,于是得到新的迭代公式( k=1,2,…..)
这就是割线法公式。它的几何意义是一个点斜式方程。
这个程序是根据割线法公式和实习指导书上牛顿迭代法程序改编而成,把牛顿迭代法相应求导数的部分用差商进行了替换。本程序把方程单独编成一个函数,目的是提高程序的通用性,计算其他方程的时候可以快速的应用。
d=fabs(x2)<1? x2-x1:(x2-x1)/x2;此段程序是为了防止x2过小时导致误差变大的情况。其他都已经在程序中标明。
- 源代码
-
#include<stdio.h>
#include<math.h>
#define N 100
#define eps 1e-6
#define eta 1e-8
float f(float x);
float Newton(float(*f)(float),float x0,float x1)
{
float x2,d,g;
int k =0;
do
{
x2=x1-(*f)(x1)*(x1-x0)/((*f)(x1)-(*f)(x0));//割线法迭代公式
if(k++>N || fabs(((*f)(x1)-(*f)(x0))/(x1-x0))<eps)//判断迭代是否收敛
{
printf("\n Newton 迭代发散");
break;
}
d=fabs(x2)<1? x2-x1:(x2-x1)/x2;//误差计算
x0=x1;x1=x2;
printf("x(%d)=%f\t",k,x1);//输出迭代计算结果
}
while(fabs(d)>eps&&fabs((*f)(x2))>eta);//根据误差判断程序是否终止
return x2;
}
float f(float x)
{
return x*x-exp(x);//方程
}
void main()
{
float x0,x1,y0;
printf("请输入迭代初值x0,x1\n");
scanf("%f,%f",&x0,&x1);
printf("x(0)=%f\n",x0);
y0=Newton(f,x0,x1);
printf("方程的根为%f\n",y0);//输出结果
}
-
实验结果
(1)
(2)
(3)
文章评论