⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pmo_work8n.java

📁 实用最优化方法,java源程序,关于碰壁法,大连理工大学.
💻 JAVA
字号:

import java.io.*;
class PMO_work_8n {	
	 public static double fx1(double x1,double x2,double r){
		double z;
		z=1+r*(2*x1/(x2-Math.pow(x1,2)))-r/x1;
	    return z; 
         }
     public static double fx2(double y1,double y2,double r){
		double z;
		z=1-r/(y2-Math.pow(y1,2));
	    return z; 
         }
     public static double bx(double y3,double y4){
		double z;
		z=-Math.log(y4-Math.pow(y3,2))-Math.log(y3);
	    return z; 
         }        
     public static void main(String[] args) {
         double r=1;
         double c=4;
         double a=0.01;
         double x[]={0.01,0.01};
         for(int i=0;i<10;i++){
         	double []x0=new double [2];
         	double b=0.01;
         	//以下为梯度法求极小值
         	for(int j=0;j<10;j++){
         		x0[0]=x[0];
         		x0[1]=x[1];
         		double []s=new double [2];
         		double [][]s2=new double [3][2];
         		s[0]=-fx1(x0[0],x0[1],r);
         		s[1]=-fx2(x0[0],x0[1],r);
         	    /*
         		System.out.println("s0"+s[0]);
         		System.out.println("s1"+s[1]); 
         		*/
         		if(Math.sqrt(Math.pow(s[0],2)+Math.pow(s[1],2))<b)
         		break;
         		//以下为二分法求λ值
         		double a1=0;
         		double b1=100;
         		double c0=0.00001;
         		double d=0;
         		for(int k=0;k<10;k++){
         			double []ls=new double [3];
         			d=(a1+b1)/2;
         			for(int l=0;l<2;l++){
         				s2[0][l]=x[l]+d*s[l];
         			}
         			for(int l=0;l<2;l++){
         				s2[1][l]=x[l]+a1*s[l];
         			}
         			for(int l=0;l<2;l++){
         				s2[2][l]=x[l]+b1*s[l];
         			}
         			for(int l=0;l<3;l++){
         				ls[l]=fx1(s2[l][0],s2[l][1],r)*s[0]+fx2(s2[l][0],s2[l][1],r)*s[1];
         			}
         			if(Math.abs(ls[0])<c0)
         			break;
         			if(ls[0]*ls[1]>0){
         			a1=d;
         			}else{
         		    b1=d;
         			}
         			/*
         			System.out.println("ls0"+ls[0]); 
         			System.out.println("d"+d); 
         			*/    
         			}
         			      			
         		//结束二分法
         		for(int k=0;k<2;k++){
         			x0[k]+=d*s[k];
         		} 
         		 
     		System.out.println("x00"+x0[0]);
     		System.out.println("x01"+x0[1]);    
         	}
         	
         	//结束剃度法
         	if(r*bx(x0[0],x0[1])<a){
         		for(int j=0;j<2;j++){
         			x[j]=x0[j];
         		    }
         		break;
         	}
         	r=r/c;
         	System.out.println("bx"+bx(x0[0],x0[1]));        	
         }
         
         System.out.println("r"+r);
         double minx=x[0]+x[1];
		try{
        FileWriter letters=new FileWriter("d:\\PMO_work8_n.txt");
        letters.write("当x=:"+x[0]);
        letters.write(","+x[1]);
        letters.write("时,");
		letters.write("f(x)的极小值为:"+minx);
		letters.write(".");
		letters.close();
		}catch(IOException e){
			System.out.println("Error--"+e.toString());
			}
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -