zoukankan      html  css  js  c++  java
  • 算法学习——枚举之超级方程

    算法描述


    求区间(2,3)的一个解,精确到小数点后8位

    算法思路

    1. 首先是要判断该区间是否有解,这里使用数学中的定义,f(a)*f(b)<0,则在a与b之间有解,我们从2开始,逐渐加0.1,与f(3)相乘,判断两者之积是否为0,即可知道是否有解

    2. 有解的话我们就可以继续下一步了,先设置一个数值min,从f(2)开始,一次加上0.1,寻找f(x)最小数值时候的x的值,以此x的值缩小范围,继续重复之前的步骤,经过多次循环之后,即可找到精度较大的x

    算法实现

    	double a,b;
    	System.out.println("输入上限");
    	Scanner scanner = new Scanner(System.in);
    	a = scanner.nextInt();
    	System.out.println("输入下限");
    	b = scanner.nextInt();
    	scanner.close();
    	boolean isHave = false;//false无解
    	for(double i = a;i<=b;i=i+0.1){
    		if(fun(i)*fun(b)<=0){
    			isHave = true;
    			break;
    		}
    	}
    	if(isHave){
    		System.out.println("有解");
    		int k = 1;
    		double y,c = 0.1,min=100,x1=0;//min赋值一个较大的初值
    		while(k<=8){
    			for(double x=a;x<=b;x=x+c){
    				//System.out.println(x);
    				y = fun(x);
    				
    				if(Math.abs(y)<min){
    					min = Math.abs(y);
    					
    					x1 = x;
    				}
    			}
    			c = c/10;
    			//System.out.println(c);
    			a = x1-5*c;
    			b = x1+5*c;
    			k++;
    		}
    		DecimalFormat fm = new DecimalFormat("0.00000000");
    		System.out.println(fm.format(x1));
    	}else{
    		System.out.println("无解");
    	}
    	public static double fun(double x){
    		return 2*Math.pow(x, 2)*Math.pow(Math.sin(x), 7)+3*Math.pow(x, 0.5)*Math.cos(x)-Math.exp(x)/5;
    	}
    

    结果

  • 相关阅读:
    日志组件一:Log4j
    HTTPS加密那点事--轻松秒懂HTTPS非对称加密
    图解Git
    Python 迭代器 & __iter__方法
    Fiddler 抓包工具总结
    Python使用struct处理二进制(pack和unpack用法)
    Python binascii
    常见证书格式及相互转换
    MyBatis Generator 详解
    MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
  • 原文地址:https://www.cnblogs.com/stars-one/p/9652958.html
Copyright © 2011-2022 走看看