最优化上机报告 c语言,最优化外点法.doc

最优化外点法

西安电子科技大学

——电子工程学院

最优化方法及应用(2)

上机报告

外点法求最优解xxxxxxxxxxxxxxxxxxxxx02951

一、问题描述:

Min

s.t

二、问题分析

实现方法:外点法(C语言)。

外点法算法基本步骤:

1.构建函数.

2.输入初始点X.

3.用最速下降法求得到较优点.

4.若,则就是所求最优点,打印结果。否则转5.

5.,k=k+1,转3.

三、代码

// WaiDianFa.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#define _accuracy 0.0001

//f()

float f(float x1,float x2){

return x1*x1+x2*x2;

}

//F()

float F(float x1,float x2,int M){

float sum;

sum = (x1+x2-1>=0)?(x1*x1+x2*x2):(x1*x1+x2*x2+M*(x1+x2-1)*(x1+x2-1));

return sum;

}

//grad()

void grad(float x[2],float g[2],int m){

if(x[0]+x[1]-1>=0){

g[0] = 2*x[0];

g[1] = 2*x[1];

}

else{

g[0] = 2*x[0]+m*2*(x[0]+x[1]-1);

g[1] = 2*x[1]+m*2*(x[0]+x[1]-1);

}

}

//

void plusx(float x1[2],float x0[2],float g[2],float t){

x1[0] = x0[0]+t*g[0];

x1[1] = x0[1]+t*g[1];

}

//gold()

void gold(float &a,float &b,float x[2],float g[2],int M){

float t1,t2;

float x1[2],x2[2];

t2=a+(float)0.382*(b-a);

plusx(x2,x,g,t2);

t1=a+b-t2;

plusx(x1,x,g,t1);

float f1,f2;

f1=F(x1[0],x1[1],M);

f2=F(x2[0],x2[1],M);

if(f1

else if(f1>f2) b=t1;

else {a=t2;b=t1;}

}

//

void linesearch(float Xk1[2],float Xk0[2],float g[2],int M){

float mina,maxb,Lanbuda;

/*searchRange(mina,maxb,Xk0,g);*/

mina = -100;

maxb =100;

while (maxb-mina>_accuracy)

{

gold(mina,maxb,Xk0,g,M);

}

Lanbuda = (mina+maxb)/2;

plusx(Xk1,Xk0,g,Lanbuda);

}

void find_min(float x[2],int M){

int k =0;

float x1[2]={x[0],x[1]};

float g[2];

float f0,f1;

f0 = F(x[0],x[1],M);

grad(x,g,M);

while (1)

{

if(0.01>g[0]*g[0]+g[1]*g[1]) break;

if(++k>1000) break;

//if (g[0]*g[0]+g[1]*g[1]==0) break;

linesearch(x1,x,g,M);

f1 = F(x1[0],x[1],M);

grad(x1,g,M);

x[0] = x1[0];

x[1] = x1[1];

f0 = f1;

}

printf("M=%d:\tX=[%.3f,%.3f]\t",M,x[0],x[1]);

printf("minf(X)=%.3f\n",f1);

}

int main(int argc, char* argv[])

{

float x[2] = {-10,-10};

const int C = 10;

int M = 1;

float threshold = M*(x[0]+x[1]-1)*(x[0]+x[1]-1);

wh

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值