Rosen梯度投影法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

package XU;

import Jama.Matrix;

/*

* 通用性说明:

* 当目标函数不同时,程序需修改的地方如下

* 1、函数getFunction_xy中的f

* 2、求梯度的函数getGradient

* 3、线性约束方程组系数矩阵A

* 4、线性约束方程组矩阵b

* 5、可行点,初始可行点最好多选择几个不同的去求最值,以避免求出的只是区域极值而不是全域最值

*/

public class Rosen {

//实现返回函数的代数式,在最优化目标函数的表达式变化时,在这个函数中改即可,避免在进退法和黄金分割法中更改

public static double getFunction_xy(double x,double y){

double f=0;

f=Math.pow(x,2)*y*(4-x-y);

return f;

}

//求梯度,注意不同的目标函数,梯度不一样,此函数不具有通用性

public static double[] getGradient(double[] Xi){

double[] Gradient=new double[Xi.length];

Gradient[0]=Xi[0]*Xi[1]*(8-3*Xi[0]-2*Xi[1]);

Gradient[1]=Math.pow(Xi[0],2)*(4-Xi[0]-2*Xi[1]);

/*

System.out.println();

System.out.println("梯度为:");

for(int i=0;i

System.out.print(Gradient[i]+",");

System.out.println();

*/

return Gradient;

}

public static void main(String[] args){

double[] Minf=new double[3];

//线性约束方程组系数矩阵A

double[][] A={

{-1,-1},

{1,0},

{0,1}

};

//线性约束方程组矩阵b

double[] b={-6,0,0};

//存储可行点

double[] Xi={2,2};

Minf=getMminf(A,b,Xi);

System.out.println(Minf[0]+","+Minf[1]+","+Minf[2]);

}

//以下为各种不需修改的功能函数

/*功能:解决二元非线性函数在线性约束条件下的极值问题(投影梯度算法)

* 注意以下几点(二元情况下):

* 1、可行点Xi一定为两个元素的向量

* 2、矩阵A1的大小是变化的,行数是不定的,但列数一定为2。A2的情况与A1一样。b1、b2的行数是变化的,但其列数必为1。

* 3、矩阵P的大小一定为2x2

* 4、梯度矩阵的大小一定为2x1

* 5、矩阵d一定为2x1

* 6、矩阵w的行数与A1相同,列数为1列

*/

public static double[] getMminf(double[][] A,double[] b,double[] Xi){

//存储极值点

double[] X=new double[2];

//精度

double eps=0.00000000000000001;

boolean bConti=true;

while(bConti){

//获得矩阵A1,A2,b1,b2

double[][] A1_array=getA1(A,b,Xi); //A1_a为向量p

double[][] A2_array=getA2(A,b,Xi);

double[] b1_array=getb1(A,b,Xi);

double[] b2_array=getb2(A,b,Xi);

//获得矩阵A1,A2,b1,b2的长度,如果长度为0,则为空

//int len_A1row_array=A1_array.length;//A1的行长度(行数)

//int len_A1column_array=A1_array[0].length;//A1的列长度(列数)

//int len_A2row_array=A2_array.length;

//int len_A2column_array=A2_array[0].length;

int[] lenA1_array=dGetlen(A1_array);//lenA1_array[0],lenA1_array[1]分别为行数和列数

int[] lenA2_array=dGetlen(A2_array);//lenA2_array[0],lenA2_array[1]分别为行数和列数

int len_b1_array=b1_array.length;

int len_b2_array=b2_array.length;

Matrix d=new Matrix(2,1);//创建矩阵d,2行1列

int i=0;

while(true){

double[][] A1sub_array=new double[lenA1_array[0]-i][lenA1_array[1]];

int k=lenA1_array[0]-i;

Matrix P=new Matrix(2,2);//创建Matrix类,矩阵中的元素为0.

P=Matrix.identity(2,2); //创建单位矩阵P

/*

System.out.println("矩阵P初始化为:");

P.print(2,8); //打印矩阵P

*/

//删去后i行

A1sub_array=getAi(A1_array,i);

/*

System.out.println("数组A1sub_array"+i+"为");

dPrint(A1sub_array);

*/

if(k>0){//当A1不为空

Matrix A1sub=new Matrix(A1sub_array);

/*

System.out.println("矩阵A1sub"+i+"为");

A1sub.print(2,8);

*/

Matrix A1sub_T=new Matrix(lenA1_array[1],lenA1_array[0]-i);

A1sub_T=A1sub.transpose(); //矩阵转置.

//System.out.println("矩阵A1sub_T"+i+"为:");

//A1sub_T.print(lenA1_array[0],2);

P.minusEquals(A1sub_T.times(((A1sub.times(A1sub_T)).inverse())).times(A1sub)); //计算P=I-(A1)...

//System.out.println("矩阵P"+i+"为:");

//P.print(2,8);

相关文档
最新文档