作业帮 > 综合 > 作业

Matlab 函数编辑,

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/05/15 13:00:24
Matlab 函数编辑,
求档β值为0.5 ,1.4时Xi的分布情况~ r 是0.062
这个问题的模型本身并不复杂,属于一个非线性约束优化问题.但由于优化变量比较多,而且目标函数和约束条件的形式比较特殊,使用常规的优化方法很容易失败(我试着用fmincon求解,在构造初始可行解上也花了不少时间,但结果不理想). 这里使用遗传算法求解,代码如下:function zd
r=0.062;
L=1000;
e = 2;
n = 7;
objfun = @(x) sum(x.*((1+r).^(1:n)-1));
B = 0.5:0.5:4;
X = zeros(length(B),10);
for ii=1:length(B)
    b = B(ii);
    opt = gaoptimset('Generations',1e5,'display','iter','Tolcon',1e-3);
    for jj=1:20
        [x,fval,flag] = ga(objfun,n,[],[],[],[],[],[],@nlcon,opt)
        if flag == 1, break, end
    end
    X(ii,:) = [x fval flag jj];
end
 
plot(B,X(:,1:n),'.-')
xlabel('\beta')
ylabel('x_i')
legend(arrayfun(@(i){sprintf('x_%i',i)},1:n),0)
figure
plot(B,X(:,n+1),'.-')
xlabel('\beta')
ylabel('optimal solution')
figure
plot(1:n,X(:,1:n),'d:')
xlabel('i')
ylabel('x_i')
legend(arrayfun(@(b){sprintf('\\beta = %.1f',b)},B))
set(gca,'xticklabel',arrayfun(@(i){sprintf('x%i',i)},1:n))
num2str([B' X(:,1:n)],' %.5g')
 
    function [c,ce] = nlcon(x)
        c = [];
        ce(1) = sum(x)-L;
        ce(2) = sum( (e-log(1:n)).*x/L) - b;
    end
end 有几点需要说明的:1、约束条件中涉及到几个常数在主程序中也可能用到,为方便起见,将其写成嵌套函数的形式.2、遗传算法本质上带有随机性,求出的结果未必是全局最优的.3、仍然因为遗传算法本质上是随机的,单次求解的结果有一定的偶然性,有些时候仍然会失败.程序中对此做了一个简单的处理——如果求解失败(根据ExitFlag判断),则重新进行尝试.目前设定的重试次数是20次,根据我实际计算的情况看,对于某些β值,可能需要5-6次甚至十几次才能成功.4、计算需要的时间可能比较长,希望做好思想准备. 下面是一些结果:
再问: 亲 代码是不是少了点 是不是还有别的定义的公式函数?
再答: 代码是完整的。 我在另一台机器上复制代码存为M文件,可以运行。时间比较长,半小时了还没完。 你运行有问题吗?有问题具体贴出来。