C语言求方程根

  1. 用迭代法求 x=√5

    	#include<stdio.h>
    	#include<math.h>
    	
    	/*
    	用迭代法求 x=√5
    	求平方根的迭代公式为:X(n+1)=(Xn+a/Xn)/2
    	*/
    	int algo01(){
    		float x1,x2;
    		float a=5;
    	    x2=a/2; //要先预估一个值x1,其实可以随便找,通常取x1=a/2
    		do{
    			x1=x2;  
    			x2=(x1+a/x1)/2; //平方根的迭代公式
    		}while(fabs(x1-x2)>=1e-5);  //如果不满足精确度则一直做
    		printf("迭代法求平方根,该数的平方根约为:%f\n",x2);
    	}
    	
    	int main(){
    		algo01();
    	}
    
  2. 牛顿迭代法求方程f(x)=2x ^ 3-4x ^ 2+3x-6=0在1.5附近的根

    	#include<stdio.h>
    	#include<math.h>
    	
    	/*
    	牛顿迭代法求方程f(x)=2x^3-4x^2+3x-6=0在1.5附近的根
    	对f(x)求导后f'(x)=6x^2-8x+3
    	*/
    	int algo02(){
    		float x1,x2;
    		float fx1,fx2;
    		x2=1.5;   //在1.5附近的根
    		do{
    			x1 = x2;
    			fx1 = 2*x1*x1*x1 - 4*x1*x1 + 3*x1 - 6;  //f(x)
    	        fx2 = 6*x1*x1 - 8*x1 + 3;               //f'(x)
    	        x2 = x1 - fx1/fx2;                      //x2 = x1 - f(x1)/f'(x)
    		}while(fabs(x1-x2)>=1e-5);   //如果不满足精确度则一直做
    		printf("牛顿迭代法求解方程,该方程的根约为:%f\n",x2);
    	}
    	
    	int main(){
    		algo02();
    	}
    
  3. 二分法求方程的根

    	#include<stdio.h>
    	#include<math.h>
    	
    	/*
    	二分法求方程的根
    	给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
    	1 确定区间[a,b],验证f(a)•f(b)<0(这是前提,选取的区间必须满足这个条件),给定精确度ξ
    	2 求区间(a,b)的中点c
    	3 计算f(c)
    	  (1) 若f(c)=0,则c就是函数的零点;
    	  (2) 若f(a)•f(c)<0,则令b=c;
    	  (3) 若f(c)•f(b)<0,则令a=c.
    	  (4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复2-4.
    	*/
    	
    	float fx(float x){  //求出方程在x处的解
    	    return 2*x*x*x - 4*x*x + 3*x - 6;
    	}
    	
    	void algo03(){
    		float x1,x2;
    		float fx1,fx2;
    		float tmp;
    		float mid;
    		do{
    			printf("请输入x1和x2【可以输入-15和10】:\n");
    			scanf("%f%f", &x1,&x2);
    			if (x1>x2){                //令x1<x2
    	            tmp = x1;
    	            x1 = x2;
    	            x2 = tmp;
    	        }
    		    fx1 = fx(x1);
    	        fx2 = fx(x2);
    		}while(fx1*fx2>0);            //确保fx1*fx2<0才可以用此方法
    		if(fabs(fx1)<=1e-5)           //如果满足精确度直接打印结果
    	        printf("二分法求解方程,该方程的根约为:%f\n", x1);
    		else if(fabs(fx2)<=1e-5)      //如果满足精确度直接打印结果
    	        printf("二分法求解方程,该方程的根约为:%f\n", x2);
    		else{
    	        while(fabs(x1-x2)>=1e-5){ //如果不满足精确度则一直做
    	            mid=(x1+x2)/2;        //求x1和x2的中点值mid
    	            if(fx(mid)*fx2<0)
    	                x1 = mid;         //在【mid,x2】中去找根
    	            else
    	                x2 = mid;         //在【x1,mid】中去找根
    	        }
    	        printf("二分法求解方程,该方程的根约为:%f\n", x2); //x1和x2相差很小
    	    }
    	}
    	
    	int main(){
    		algo03();
    	}
    
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值