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

📄 pmo_work_8w.java

📁 优化方法外惩罚法java程序,大连理工大学<实用最优化方法>
💻 JAVA
字号:

import java.io.*;
class PMO_work_8w {	
	 public static double px1(double x1,double x2,double m){
		double z;
		z=4*m*Math.pow(x1,3)-4*m*x1*x2+2*x1+1;
	    return z; 
         }
     public static double px2(double y1,double y2,double m){
		double z;
		z=1-2*m*Math.pow(y1,2)+2*m*y2;
	    return z; 
         }
     public static double g1(double y3,double y4){
		double z;
		z=Math.pow(y3,2)-y4;
	    return z; 
         } 
     public static double g2(double y5,double y6){
		double z;
		z=-y5;
	    return z; 
         }        
     public static void main(String[] args) {
         double m=5000.0;
         double c=10.0;
         double a=0.0000001;
         double x[]={0,0.01};
         for(int i=0;i<1000;i++){
         	double []x0=new double [2];
         	double b=0.0001;
         	//以下为梯度法求极小值
         	for(int j=0;j<1000;j++){
         		x0[0]=x[0];
         		x0[1]=x[1];
         		double []s=new double [2];
         		double [][]s2=new double [3][2];
         		s[0]=-px1(x0[0],x0[1],m);
         		s[1]=-px2(x0[0],x0[1],m);
         		if(Math.sqrt(Math.pow(s[0],2)+Math.pow(s[1],2))<b)
         		break;
         		//以下为二分法求λ值
         		double a1=0;
         		double b1=100;
         		double c0=0.000001;
         		double d=0;
         		for(int k=0;k<1000;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]=px1(s2[l][0],s2[l][1],m)*s[0]+px2(s2[l][0],s2[l][1],m)*s[1];
         			}
         			if(Math.abs(ls[0])<c0)
         			break;
         			if(ls[0]*ls[1]>0){
         			a1=d;
         			}else{
         		    b1=d;
         			}
         			}         			
         		//结束二分法
         		for(int k=0;k<2;k++){
         			x0[k]+=d*s[k];
         		}        		
         	}
         	//结束剃度法
         	double maxt=g1(x0[0],x0[1]);
         	if(g1(x0[0],x0[1])<g2(x0[0],x0[1]))
         	maxt=g2(x0[0],x0[1]);
         	if(maxt<a){
         		for(int j=0;j<2;j++){
         			x[j]=x0[j];
         		    }
         		break;
         	}
         	m=c*m;        	
         }
         System.out.println(m);
         double minx=x[0]+x[1];
		try{
        FileWriter letters=new FileWriter("d:\\PMO_work8_w.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 + -