优化设计-单纯型法
本次编程采用 MATLAB 软件编写计算程序,附程序如下(包含注释):
clear all;clc
%% 初始参数设定
syms x1 x2 x
f=x1^2+2*x2^2-4*x1-2*x1*x2;% f 函数符号表达式
x0=[0 0];% 给定初始点
h=4; % 初始单纯形构造因子
alpha=1; % alpha 反射因子
gama=2; % gama 扩张因子
beta=0.5;% beta 收缩因子
eps=5e-3;% eps 精度值
%% 构造初始单纯形
x0=x0';
X(:,1)=x0;
Num_var_f=length(symvar(f));%二维函数
for i = 1:Num_var_f %二维函数,需要三个顶点坐标
x = zeros(Num_var_f,1);%预分配内存
x(i) = x0(i) + h;
X(:,i+1)=x;% 将单纯形存储
end
n = 0; %迭代循环次数
m = 1; %精度差值
k = 0; %数据记录
g = 0; %操作记录
%% 计算函数值
for i = 1:Num_var_f+1
F_val(i)=double(subs(f,symvar(f),X(:,i)'));
end
[F_sort,F_index]=sort(F_val);%从小到大排列函数
% 最好点
f_best_0=F_sort(1);
X_best_0=X(:,F_index(1));
% 最差点
f_bad_n=F_sort(end);
X_bad_n=X(:,F_index(end));
% 次差点
f_nextbad_1n=F_sort(end-1);
X_nextbad_1n=X(:,F_index(end-1));
% 计算形心
Xc_n1=1/Num_var_f*sum(X(:,F_index(1:end-1)),2);
f_Xc_n1=double(subs(f,symvar(f),Xc_n1'));
%% 循环迭代语句
while m > eps
%% 反射
flag = 0;
X_reflect_n2=Xc_n1+alpha*(Xc_n1-X_bad_n);
f_reflect_n2=double(subs(f,symvar(f),X_reflect_n2'));
%% 反射成功
if f_reflect_n2= f_nextbad
X_reflect_shrink_n4=Xc_n1+beta*(X_reflect_n2-Xc_n1);% 收缩点
f_reflect_shrink_n4=double(subs(f,symvar(f),X_reflect_shrink_n4'));
X(:,F_index(end)) = X_reflect_shrink_n4;
g=2;%收缩点
end
end
%% 计算迭代完后函数序列,并计算精度
for i = 1:Num_var_f+1
F_val(i)=double(subs(f,symvar(f),X(:,i)'));
end
[F_sort,F_index]=sort(F_val);%从小到大排列函数
% 最好点
f_best_0=F_sort(1);
X_best_0=X(:,F_index(1));
% 最差点
f_bad_n=F_sort(end);
X_bad_n=X(:,F_index(end));
% 次差点
f_nextbad_1n=F_sort(end-1);
X_nextbad_1n=X(:,F_index(end-1));
% 计算形心
Xc_n1=1/Num_var_f*sum(X(:,F_index(1:end-1)),2);
f_Xc_n1=double(subs(f,symvar(f),Xc_n1'));
% 计算精度与迭代次数
m=abs(double(subs(f,symvar(f),X(:,F_index(end))'))-f_Xc_n1);
n=n+1;
% 运算数据记录
k=k+1;
A(k)=g;
B(:,k+1)=X(:,F_index(end))';
M(k)=m;
end
%% 结果输出
minx=X_best_0;
A=A';B=B';M=M';
A
B
M
n
minx
m
得到程序记录结果为:
迭代次数
迭代操作
新点值
精度差值
n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
g
收缩
收缩
收缩
反射
反射
收缩
反射
扩张
收缩
收缩
反射
反射
收缩
收缩
反射
收缩
反射
收缩
收缩
反射
收缩
反射
x1 x2
3.0000 -2.0000
4.0000 0
-0.8750 0.7500
0 0
1.5000 1.0000
3.9375 0.6250
2.3750 0.2500
2.3125 0.8750
3.8750 1.2500
5.3223 3.2773
5.1484 2.5156
4.5313 2.6875
4.3574 1.9258
3.4822 1.8657
3.7402 2.0977
4.0349 1.6359
3.8076 1.6738
4.0657 1.9058
3.8642 2.0426
3.8384 1.9437
4.0979 2.0293
3.9985 1.9514
m
21
2.6875
9.3906
5.6367
1.5469
1.9102
2.1982
1.5261
0.5345
1.215
0.5533
0.4956
0.1663
0.1396
0.0715
0.226
0.1179
0.0301
0.0293
0.0141
0.0054
0.0031
最后得到结果为:在初始点为(0,0),初始构造因子 h=4 的情况下(即另
外两点为(4,0)与(0,4)),经过 22 次迭代运算,得到满足精度要求的最小值
点为(x1,x2)=(3.9985,1.9514),此时函数值为-7.9954。
为验证结果的准确性,通过计算与 MATLAB 画图得到函数图形与实际最小
值点为(x1,x2)=(4,2),函数最小值为-8,与计算结果基本相符。附图形与计
算过程如下: