当前位置:首页 > 数值实验报告
实验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;
共分享92篇相关文档