实验二 非线性方程求根实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
学院:电子信息工程
实验课程:计算方法
学生姓名:
学号:
专业班级:通信工程
实验二非线性方程求根
1 目的与要求
(1)进一步熟练掌握求解非线性方程的二分法与Newton迭代法。
(2)掌握二分法与Newton迭代法的算法,能运用程序设计语言和此方法编制软件求出任意指定一元三次方程在给定点附近的根。
2 实验内容
用二分法和Newton迭代法求方程
310 x x
--=在
1.5 附近的根,精确到
3
10-,输出每次的迭代结果
并统计所用的迭代次数。
3 实验原理
(1)二分法实验原理
取[a,b]区间二等分的中点x1 =(a+b)/2
(1)若f(x1)=0,则x1是f(x)=0的实根。
(2)若f(a)f(x1)<0 成立,则x* 必在区间(a, x1)内,取a1=a,b1= x1;否则x*必在区间(x1,b)内,则取a1= x1,b1=b,这样,得到新区间[a1,b1],其长度为[a,b]的一半。
(3)如此继续下去,进行n次等分
(2)Newton迭代法实验原理
4 程序设计
(1)流程图
二分法程序流程图
Newton迭代法程序流程图
(2)程序代码
①二分法求非线性方程根#include
#include
return x*x*x-x-1;
}
double fun2(double x1,double x2)
{
return (x1+x2)/2;
}
main()
{
int n=1;
float a,b,c;
printf("二分法求非线性方程的根\n"); scanf("a=%f,b=%f",&a,&b);
if (fun1(a)*fun1(b)<0)
{
while(fabs(b-a)>1e-3)
{
c=fun2(a,b);
if (fun1(a)*fun1(c)<0)
{
b=c;
}
else if (fun1(c)*fun1(b)<0)
{
a=c;
}
else
{
break;
}
printf("当前计算次数为%d 计算结果为%lf\n",n,fun2(a,b));
n++;
}
}
else
{
printf("不符合二分法使用条件,请重新输入:\n");
}
}
②Newton迭代法
#include
#include
double fun1(double x)
{
return x*x*x-x-1;
}
double fun2(double x)
{
return 3*x*x-1;
}
double root(double num)
{
double x1,x0;
int n=1;
x0=num;
if (fun2(x0)==0)
{
printf("Algorithm failed. Exit !"); }
else
{
x1=x0-fun1(x0)/fun2(x0);
printf("Newton迭代法求根\n");
}
while (fabs(x1-x0)>1e-3)
{
printf("当前计算次数为%d 计算结果为%lf\n",n,x1);
x0=x1;
x1=x0-fun1(x0)/fun2(x0);
n++;
}
}
main()
{
root(1.5);
}
5 实验结果与分析
(1)二分法求根结果界面
(2)Newton迭代法求根结果界面
分析:
(1)本次试验两种算法均采用了while循环及if-else判断语句,编程函数并由主函数调用,较简单的实现了二分法与Newton迭代法的编程任务。(2)由本次试验结果来看,同等精度条件下,Newton 迭代法收敛快,稳定好,计算次数少,是求解非线性方程根的有效方法。但是同时可以看出二分法具有计算简单,程序容易实现,可在大范围内求根的特点。(3)此次试验较好的完成了任务,巩固了课堂知识。