?? pmo_work_8w.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 + -