数学建模

扶醉桌前 提交于 2020-02-21 09:42:14

数学建模--函数 第三篇

非线性优化问题,以及灰色预测


非线性优化问题

简介

  • 使用MATLAB求解非线性方程,有(无)约束函数的极值。

代码

% 求解非线性约束问题
% 待优化表达式f(x, y)=x^3-y^3+x*y+2*x^2
% 约束条件为x^2+y^2<=6和x*y=2
% 创建以下函数并保存为fun.m
function f=fun(x)
    f=x(1)^3-x(2)^3+x(1)*x(2)+2*x(1)^2;
end

% 创建约束条件的函数文件并保存为fcontr.m
function [c, d]=fcontr(x)
    c=x(1)^2+x(2)^2-6; % c为不等式约束,需转化为<=0的格式
    d=x*y-2; % d为等式约束,需化为=0的格式
end

% [x fval exitflag]=fmincon('fun',[1 2],[],[],[],[],[],[],'fcontr');
%-------------------------------------------------------------------------------

%非线性方程无约束优化(模拟退火&fminunc)
function sol
    % 保存为fun.m
    function f=fun(x)
        f=((33*x(3))/10 - (33*x(2))/10 + 231/5)*(x(3) - x(2)+ 14) + ((37*x(2))/10 - (37*x(1))/10 + 851/10)*(x(2) - x(1) + 23) + (29*x(1)^2)/10 +(5*x(2)^2)/2 + 4*x(3)^2;
    end

    % [x,fval]=simulannealbnd(@fun,[0;0;0])
    [x,fval] =fminunc('fun',simulannealbnd(@fun,[0;0;0]));
end
%-------------------------------------------------------------------------------

%非线性方程无约束优化(遗传算法&fminunc)
% 待优化方程保存为fun.m
function f=fun(x)
    f=((33*x(3))/10 - (33*x(2))/10 + 231/5)*(x(3) - x(2)+ 14) + ((37*x(2))/10 - (37*x(1))/10 + 851/10)*(x(2) - x(1) + 23) + (29*x(1)^2)/10 +(5*x(2)^2)/2 + 4*x(3)^2;
end

% [x,fval] =fminunc('fun',ga(@fun,3))
%-------------------------------------------------------------------------------

%非线性方程线性约束优化(遗传算法&fmincon)
% 非线性优化问题(非线性表达式 s.t. 约束条件)
% 例如求非线性表达式为 f(x)=\sum{i=1}^{11} b_i * \log(x_i+t_i) - b_i * \log(t_i)的最大值
% 约束条件为x_i>=0 (i=1,2,...11) 以及 \sum_{i=1}^{11} x_i=100000000

% gaoptimset('PlotFcns',@gaplotbestf)为options的参数,可以画出下降图,如果画出来不合适,可以使用
% gaoptimset('Generations',100,'PlotFcns',@gaplotbestf)来限定迭代次数,这样输出的图的横坐标就限制在100内
% 在工具箱里面也可以设置plot的参数

% 如果有非线性约束,见http://blog.csdn.net/qq_37043191/article/details/77898335
% 如果有整数约束,则在GUI的IntConIndex中填写如[1 3 5](表示x1,x3,x5为整数)
% 01问题则在IntConIndex中填写[1 2 ....],再将每个变量上限下限填为1和0

% 以下内容保存为fun.m
function f =fun(x)
  b= [0.903, 0.501, 0.655 , 1.075 , 0.965 , 0.629 , 1.429 , 1.275 , 0.755 , 1.701 , 1.219];
  t= [60202000,22027551,105132543,2929453717 ,71205991,95780211,36908000,48132000,111949554,62312533,51877376];
  f=b(1)*log(t(1)+x(1))-b(1)*log(t(1));
  for i=2:11
    f = f+b(i)*log(t(i)+x(i))-b(i)*log(t(i));  
  end
  f=-f; % 转化为求最小值
end

% [x,fval] =fmincon('函数名',ga(@函数名, 变量个数, A, b, Aeq, beq),A ,b ,Aeq ,beq);
% [x,fval] =ga(@fun,11,-eye(11,11),zeros(11,1),ones(1,11),[100000000],[],[],[],gaoptimset('PlotFcns',@gaplotbestf));
% [x,fval] =fmincon('fun',ga(@fun,11,-eye(11,11),zeros(11,1),ones(1,11),[100000000]),-eye(11,11),zeros(11,1),ones(1,11),[100000000]);

灰色预测

简介

  • 关于所谓的“颜色”预测或者检测等,大致分为三色:黑白灰,在此以预测为例阐述。其中白色预测是指系统的内部特征完全已知,系统信息完全充分;黑色预测是指系统的内部特征一无所知,只能通过观测其与外界的联系来进行研究;灰色预测则是介于黑、白两者之间的一种预测,一部分已知,一部分未知,系统因素间有不确定关系。
  • 灰色预测是通过计算各因素之间的关联度,鉴别系统各因素之间发展趋势的相异程度。其核心体系是灰色模型(Grey Model,GM),即对原始数据做累加(或累减、均值等方法)生成近似的指数规律再进行建模的方法。

代码

%GreyPredictionNextTime
clc,clear
a=[390.6,412,320,559.2,380.8,542.4,553,310,561,300,632,540,406.2,313.8,576,587.6,318.5];
t0=find(a<=320);
t1=cumsum(t0);n=length(t1);
B=[-0.5*(t1(1:end-1)+t1(2:end)),ones(n-1,1)];Y=t0(2:end);
r=B\Y;
y=dsolve('Dy+a*y=b','y(0)=y0');
y=subs(y,{'a','b','y0'},{r(1),r(2),t1(1)});
digits(6),y=vpa(y); %为提高预测精度,先计算预测值,再显示微分方程的解
fy=inline(y,'t');
yuce1=[0,fy(0:10)];
yuce=diff(yuce1)%预测结果
%---------------------------------------------------------------------------------

%GreyPredictionNextValue
clc,clear
x0=[71.1 72.4 72.4 72.1 71.4 72.0 71.6];
n=length(x0);
lamda=x0(1:n-1)./x0(2:n);
range=minmax(lamda);
x1=cumsum(x0);
for i=2:n
    z(i)=0.5*(x1(i)+x1(i-1));
end
B=[-z(2:n),ones(n-1,1)];
Y=x0(2:n);
u=B\Y;
x=dsolve('Dx+a*x=b','x(0)=x0');
x=subs(x,{'a','b','x0'},{u(1),u(2),x1(1)});
fy=inline(x,'t');
digits(6),y=vpa(x);
yuce=[x0(1),diff(fy(1:n))]%预测值 为提高预测精度,先计算预测值,再显示微分方程的解
epsilon=x0-yuce%计算残差<0.2即可
delta=abs(epsilon./x0)%计算相对误差
rho=1-(1-0.5*u(1))/(1+0.5*u(1))*lamda%计算级比偏差值<0.2即可


先粘代码,运行结果再说O(∩_∩)O

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!