采用参数化编程,使程序具有推广性
main.m
%% MATLAB线性规划
clear;clc;
%% 初始参数
a = [30,40,20,10]';
b = [20,20,30,10]';
d = [15,14,15.3,14.8]';
N = 4;%一个生产周期包括几个部分(和a b d 数组维数相同)
%% 定义符号参数x和y
for i = 1:N
x(i) = sym(['x',num2str(i)]);
end
for i = 1:N+1
y(i) = sym(['y',num2str(i)]);
end
sum = 0;
y(1) = 0;
%% 使用迭代法求得目标函数对应自变量系数
for ii = 1:N
y(ii+1) = x(ii)+y(ii)-b(ii);
sum = sum+x(ii)*d(ii)+y(ii+1)*0.2;
end
p = coeffs(sum);
c = zeros(N,1);
for i = 1:N
c(i) = double(p(N+2-i));
end
%% 得到A和B
A = zeros(2*N,N);%初始化不等式系数矩阵
B = zeros(2*N,1);%初始化不等式等于什么
for i = 1:N
A(i,i) = 1;
B(i) = a(i);
end
for i = 1:N
pb = coeffs(y(i+1));
len = length(pb);
for j = 1:len-1
A(i+N,j) = -pb(len+1-j);
end
B(i+N) = pb(1);
end
%% 调用linprog求解
lb = [0,0,0,0]';
[rut,fval] = linprog(c,A,B,[],[],lb,[]);
disp('最优解对应x为:')
disp(['x1=',num2str(rut(1))])
disp(['x2=',num2str(rut(2))])
disp(['x3=',num2str(rut(3))])
disp(['x4=',num2str(rut(4))])
disp(['此时函数值为:',num2str(fval+double(p(1)))])
运行结果
最优解对应x为:
x1=20
x2=40
x3=10
x4=10
此时函数值为:1165
学习收获
1.如何定义一个符号数组
for i = 1:~
x(i) = sym(['x',num2str(i)]);
end
2.coeffs 函数用法
用于提取符号多项式每项符号变量前系数(倒序)
3.参数化编程好处
可直接修改“定义符号参数”项目即可推广到其他问题上。