实验2 方程求根
2.1 目的与要求
(1)通过对二分法与牛顿迭代法作编程练习与上机运算,进一步体会二分法与牛顿迭代法的不同特点。
(2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。
2.2 二分法
2.2.1 算法
给定区间[a,b],并设f(a)与f(b)符号相反,取ε为根的容许误差,δ为∣f(a)∣的容许误差。
①令c=(a+b)/2。
②如果(c-a)<ε或∣f(c)∣<δ,则输出c,结束;否则执行③ ③如果f(a)f(c)>0,则令a=c;否则令b=c,重复①②③。
2.2.2程序与实例
求方程f(x)=x3?4x2?10?0在1.5附近的根。
#include
float Bisection(float a,float b,float(*f)(float)) { }
float f(float x) { }
int main(int argc ,char*argv[]) {
float a=1,b=2; float x;
return x*x*x+4*x*x-10;
float c,fc,fa=(*f)(a),fb=(*f)(b); int n=1;
printf(\二分次数\\t\\tc\\t\\t f(c)\\n\while(1) {
if (fa*fb>0) {printf(\不能用二分法求解\ c=(a+b)/2,fc=(*f)(c);
printf(\ if(fabs(fc)
}
x=Bisection(a,b,f);
printf(\方程的根为%f\\n\return 0;
实验3牛顿迭代法
3.1 算法
给定初始值x0,ε为根的容许误差,η为∣f(x)∣的容许误差,N为迭代次数的容许值。 ①如果
f'(x0)?0或迭代次数大于N,则算法失效,结束;否则执行②。
f(x0)。 'f(x0)②计算x 1?x0?③若∣x1?x0∣<ε或∣f(x1)∣<η,则输出x1,程序结束;否则执行④。 ④令x0?x1,转向①。
3.2 程序与实例
求方程f(x)=x3?x2?3x?3?0在1.5附近的根。 #include
#define eps 1e-6 //宏定义根的容许误差 #define eta 1e-8 //宏定义f(x)的容许误差
float Newton(float(*f)(float),float(*f1)(float),float x0) //牛顿插值算法 {
double x1,d; int k=0; do {
x1=x0-(*f)(x0)/(*f1)(x0);
if(k++>N||fabs((*f1)(x1))
float f(float x) //原函数 { }
return x*x*x+x*x-3*x-3; {
printf(\迭代发散\
break; }
d=fabs(x1)<1?x1-x0:(x1-x0)/x1; //用三元算符(?:)缩短循环次数 x0=x1;
printf(\输出x(n)的值 }
while(fabs(d)>eps&&fabs((*f)(x1))>eta); //判定循环的条件 return x1;
相关推荐: