- 3
- 0
- 约1.69千字
- 约 4页
- 2016-12-10 发布于重庆
- 举报
c204数值计算方法编程
数值计算方法程序设计
题目:非线性方程的求解
班级:信 101
组员1:侯海龙 学号:2020314114
组员2:杨 赛 学号:2010314116
组员3:董兆军 学号:2010314120
组员4:孙 杰 学号:2010314126
组员5:辛红春 学号:2010314129
非线性方程的求解
程序设计题目为分别用对二分法和牛顿法求方程非线性。
二分法:例1
用二分法求方程
f(x) = +x?20 = 0
的唯一实根,要求误差不超过1*。
C语言程序代码
#includestdio.h
#include math.h
#define f(x) ((x*x+10)*x-20)
void main()
{ float a,b,x,eps;
int k=0;
printf(intput eps\n); // 容许误差
scanf(%f,eps);
printf(a,b=\n);
for(;;)
{scanf(%f, %f,a ,b);
if(f(a)*f(b)=0) // 判断是否符合二分法使用的条件
printf(二分法不可使用,请重新输入:\n);
else break;
}
do
{ x=(a+b)/2;
k++;
if(f(a)*f(x)0) // 如果f(a)*f(x)0,则根在区间的左半部分
b=x;
else if(f(a)*f(x)0) // 否则根在区间的右半部分
a=x;
else break;
}
while(fabs(b-a)eps); //判断是否达到精度要求,若没有达到,继续循环
x=(a+b)/2; // 取最后的小区间中点作为根的近似值
printf(\n The root is x=%f, k=%d\n,x,k);
}
运行结果:
所以=1.594563即为符合精度要求的解。
总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快,但缺点是只能求解单根。
牛顿法:例2
用牛顿法求方程
f(x) = +x?20 = 0
的唯一实根,要求精确度达到六位小数。
由例1,方程在[1,2]内有根,取=1.5。
C语言程序代码
#include stdio.h
#include math.h
float f(float x) // 定义函数f(x)
{
return((x*x+10)*x-20) ; }
float f1(float x) // 定义函数f(x)的导数
{
return (3*x)*x+10; }
void main()
{
float eps,x0,x1=1.5;
printf(input eps:\n);
scanf(%f,eps); // 输入容许误差
do
{ x0=x1; // 准备下一次迭代的初值
x1=x0-f(x0)/f1(x0); // 牛顿迭代
}
while(fabs(x1-x0)eps); //当满足精度,输出近似根
printf(x=%f\n,x1);
}
程序运行结果:
所以:x=1.594562即为方程满足精度要求的近似跟。
总结:关键是牛顿迭代的应用,程序中最大缺点是函数及其导数已唯一给出确定不可求的随意函数的根,牛顿法比二分法收敛快,可以求重根。
原创力文档

文档评论(0)