西安石油大学计算方法实验1--非线性方程的迭代数值解法

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

《计算方法》实验报告

二级学院:计算机学院

专业:计算机科学与技术

指导教师:爨莹

班级学号:201107010122

姓名:张文江

实验一 非线性方程的迭代数值解法

实验目的:

① 通过编程和插值与拟合中的某种具体算法解决具体问题,更深一步的体会计算方法这门课的重要性,同时加深对插值与拟合公式某种具体算法的理解。

② 熟悉编程环境。 2、实验要求:

实现插值与拟合中的某种具体算法编写并执行

3、实验内容:

1)用牛顿法求解01553=-x 的根,取初始值为10。

2) 用弦截法求解数学方程,()^310f x x x =--=在[1,1.5]内的根。

4、题目:

1)用牛顿法求解01553=-x 的根,取初始值为10。

2) 用弦截法求解数学方程,()^310f x x x =--=在[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)迭代法结果

相关文档
最新文档