实验一非线性方程组求解实验报告

计算方法实验报告

专业班级:姓名:学号:实验成绩:

1.【实验题目】

非线性方程组求解

2.【实验目的】

(1).掌握二分法、迭代法、牛顿迭代法求方程近似根的基本思想与原理。

(2).掌握常用迭代算法的程序实现。

3.【实验内容】

迭代法是求解非线性方程的基本方法,其构造方法可以有多种多样,但关键

是怎样才能使迭代收敛且有较快的收敛速度。

考虑一个简单的代数方程,针对该方程,可以构造多种迭

代法,如:

取初始值,取,分别用以上迭代格式作实验,记录各算法的迭代过程

4. 【实验要求】

(1)取定某个初始值,按方案1~3对非线性方程求根,它们的收敛性如何?

重复选取不同的初始值,反复实验。请读者自行设计一种比较形象的记录方式(如

利用Matlab的图形功能),分析三种迭代法的收敛性与初值选取的关系。

(2)对三个迭代格式的某一种,分别取不同的初始值进行迭代,结果如何?试分析迭代法对不同的初值是否有差异?

(3)对代数方程,分别用

方案1 用二分法求解;

方案2 用牛顿法求解;

5. 【算法描述】

二分法算法步骤

1)计算有根区间的端点a,b及预先给定的精度e。

2)计算中点(a+b)/2。

3)若f(x)f(a)<0,则x?b,转向4);否则,x?a,转向4).

4)若b-a

牛顿法迭代法的计算步骤

1)给出初始近根x0及精度e。

2)计算x x x x f f 1000)(')(?-。

3)若|x 1-x 0|

4)输出满足精度的根x 1,结束。

6. 【源程序(带注释)】

二分法

#include

#include

#include

#include

float f(float x)

{

float a;

a=x*x*x-x-1;

return a;

} /*求函数值,如果求其它函数,只需改成其它函数即可*/ main()

{

float a,b,e,x; /* a,b 分别表示有根区间的左、右端点, e 是精度要求,x 区间中点值*/

system("CLS");//清屏

printf("对代数方程x^3-x-1=0,分别用\n 方案1 用二分法求解\n"); printf(" \n please input data a =");

scanf("%f",&a);

printf(" \n please input data b=");

scanf("%f",&b);

if(f(a)*f(b)<0)

{

while(f(x)!=0)

{

x=(a+b)/2;

if(f(x)*f(a)<0)

{

b=x;

if(fabs(b-a)<0.000001)

break;

else

continue;

}

else

{

a=x;

if(fabs(b-a)<0.000001)break;

else continue;

}

}

printf("\n");

x=(b+a)/2;

printf("the root of f(x)=0 is x=%f\n",x);

}

else

printf("\ not root! afresh input\n"); /*表示[a,b] 区间无根,重新选择有根区间*/

getch();

return(x);

}

牛顿法

#include

#include

#include

#include

#define maxrept 1000 /*最大迭代次数*/

float f(float x) {

float a;

a=x*x*x-x-1;

return a; /*函数f(x) */

}

float df(float x) {

return(1+exp(-x)); /* 函数f(x)的导数) (x f ′*/ }

float iterate(float x) {

float x1;

x1=x-f(x)/df(x); /* 牛顿迭代函数iterate(x)=x-f(x) / ) (x f ′*/

return(x1);

}

main() {

float x0,x1,d;

int k=0;

// clrscr();

system("CLS");

printf("对代数方程x^3-x-1=0,分别用\n方案2 用牛顿法求解\n");

printf("\n please input x0="); /* 输入迭代初值x0 */

scanf("%f",&x0);

printf("\n k xk\n");

printf("\ %d %f\n",k,x0);

do {

k++;

x1=iterate(x0);

printf(" %d %f\n",k,x1);

d=fabs(x1-x0);

x0=x1;

}

while((d>=0.000001)&(k

if(k

printf("the root of f(x)=0 is x=%f, k=%d\n",x1,k);

else

printf("\n the iteration is failed!\n");

getch();

}

7.【实验结果与分析总结(含运行结果截图)】

相关文档
最新文档