实习题二
班级:1502011 学号: 姓名: 成绩:
1实验目的
(1)通过对二分法与牛顿迭代法做编程练习和上机运算,进一步体会二分法和牛顿法的不同。
(2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。
2 实验内容
1、用牛顿法求下列方程的根:
(1)20x x e -=
(2)10x xe -=
(3)lg 20x x +-=
2、编写割线法程序求解第一问的方程。
3实验步骤
1. 通过定义牛顿法求方程的子函数,用main 函数调用子函数求根
3 程序设计、实验结果及分析
1、用牛顿法求下列方程的根:
(1)20x x e -=
(2)10x xe -=
(3)lg 20x x +-=
I. 实验步骤:通过定义牛顿法求方程的子函数,用main 函数调用子函数求根。
II .流程图:
III.程序代码:
2、编写割线法程序求解第一问的方程。
I. 实验步骤:利用两个初始值,通过割线法求解。
II.流程图:
III.程序代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 10000
#define eps 1e-6
#define eta 1e-8
double Gexian(double(*f)(double), double x0, double x1)
{
double x2, d;
int k = 0;
do
{
x2 = x1 - (*f)(x1) / ((*f)(x1)-(*f)(x0))*(x1 - x0);
if (k++>N || fabs(((*f)(x1)-(*f)(x0)) / (x1 - x0))<eps)
{
printf("\n 割线法迭代发散");
break;
}
d = fabs(x2)<1 ? x2 - x1 : (x2 - x1) / x2;
x0 = x1;
x1 = x2;
printf("x(%d)=%lf\t", k + 1, x0);
} while (fabs(d)>eps&&fabs((*f)(x2))>eta);
printf("\n");
return x2;
}
double f1(double x)
{
return x*x - exp(x);
}
double f2(double x)
{
return x*exp(x) - 1;
}
double f3(double x)
{
return log10(x) + x - 2;
}
main()
{
double x0, x1, y0;
printf("请输入方程1迭代初值x0、x1:");
scanf("%lf%lf", &x0, &x1);
printf("x0=%lf \t x1=%lf\n", x0, x1);
y0 = Gexian(f1, x0, x1);
printf("方程1的根为%16.10f\n", y0);
printf("请输入方程2迭代初值x0、x1:");
scanf("%lf%lf", &x0, &x1);
printf("x0=%lf \t x1=%lf\n", x0, x1);
y0 = Gexian(f2, x0, x1);
printf("方程2的根为%16.10f\n", y0);
printf("请输入方程3迭代初值x0、x1:");
scanf("%lf%lf", &x0, &x1);
printf("x0=%lf \t x1=%lf\n", x0, x1);
y0 = Gexian(f3, x0, x1);
printf("方程3的根为%16.10f\n", y0);
system("pause");}
IV.运行结果:
V.结果分析:割线法的收敛速度快。
5总结
割线法的收敛速度比牛顿法略慢些,但是割线法避免了求导数,而且每迭代一次,只要求一次值,计算量比牛顿法少。
6参考资料
[1] 孙志忠. 计算方法与实习[M]. 东南大学出版社, 2011.07
[2] 谭浩强. C程序设计[M]. 清华大学出版社,2010.06。