📄 pmo_work8n.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 + -