最优化算法之鲍威尔算法(java)

最优化算法之鲍威尔算法(java)

算法原理

题目

用鲍威尔法求函数 f(x1,x2) = 10*(x1+x2-5)+(x1-x2)^2的极小值。

代码

主类

package pwell;

public class pw {
	double x1;
	double x2;
	double e11;
	double e12;
	double e21;
	double e22;
	double segma;
	double lamda;
	double m;
	double x31,x32,f3;
	public pw(double x1,double x2,double e11,double e12,double e21,double e22,double segma) {
		this.x1=x1;
		this.x2=x2;
		this.e11=e11;
		this.e12=e12;
		this.e21=e21;
		this.e22=e22;
		this.segma=segma;
		lamda=0;
		x31=0;
		x32=0;
		f3=0;
		//lamda2=0;
	}
	public void pwell() {
		int k=0;
		F f=new F();
		while(true) {
			k++;
			double f0=f.ff(x1,x2);
			//第一个方向搜索
			lamda=f.ff1(x1, e11);
			double x11=x1+lamda*e11;
			double x12=x2+lamda*e12;
			double f1=f.ff(x1, x2);
			//第二个方向搜索
			lamda=f.ff1(x1, e21);
			double x21=x11+lamda*e21;
			double x22=x12+lamda*e22;
			double f2=f.ff(x21, x22);
			//更新搜索方向
			e11=x21-x1;
			e12=x22-x2;
			//沿新方向搜索
			lamda=f.ff1(x21, e11);
			x31=x21+lamda*e11;
			x32=x22+lamda*e12;
			f3=f.ff(x1, x2);
			double y=Math.sqrt(Math.pow((x1-x31),2)+Math.pow(x2-x32, 2));
			if(y<segma) {
				break;
			}
			else {
				x1=x31;
				x2=x32;
			}
		}
		System.out.println("最优点为["+x31+","+x32+"]"+'\n'+"最优值f(x)="+f3);
	}
}

子类1

package pwell;

public class pwll {
	public static void main(String []args) {
		double x1=1;
		double x2=1;
		double segma=0.001;
		double e11=1;
		double e12=0;
		double e21=0;
		double e22=1;
		pw f=new pw(x1,x2,e11,e12,e21,e22,segma);
		f.pwell();
	}	
}

子类2

package pwell;

public class F {
	public double ff(double x1,double x2) {
		double ff=10*Math.pow((x1+x2-5), 2)+Math.pow((x1-x2),2);
		return ff;
	}
	public double ff1(double x1,double e1) {
		return (5-2*x1)/2*e1;
	}
}

运行结果

在这里插入图片描述

你可能感兴趣的:(java,算法)