Matlab使用m文件调用simulink(附matlab代码)

B站讲解视频
我就是按这个视频写的代码
我用simulink打了一个简单地模型,希望用遗传算法识别模型中的参数。
实现这个目的得流程是将simulink模型中的参数设为变量,每运行一次模型就将结果和对应的参数值读取到matlab中,然后通过遗传算法计算更优参数值,再将参数值赋给模型重新计算,得到结果开始循环。
在这里插入图片描述假如不想自己搭模型可以直接用我的,
链接:https://pan.baidu.com/s/1di1_5vJIZXUdWTOsw_EPvA
提取码:7788
–来自百度网盘超级会员V5的分享
如果要自己搭模型的话记得按视频里的操作进行设置。

我真的好心烦csdn传资源这个事,这不是一个分享平台吗,我把我的学习资源传上来供大家学习,结果其他人想下载还要充会员,甚至有的充了会员还要花钱下载。有时候看一篇博客,博主说欢迎大家下载他的文件,大家一起学习交流,结果一点开需要花钱才能下,博主自己知道自己的资源需要别人花钱才能下载吗,给博主分成是多少啊。
要是博主自己要收钱那无可厚非,可我的资源是想无偿给大家的啊,而且我一个资源分享者都无法评论我的资源,要下载后才能评论,真是离谱,一个好端端的分享平台竟然干这事。
所以我把资源放在百度网盘里了,大家可以免费下载。

评论说链接挂掉了,很奇怪我明明选的是永久有效,我再放一个新的
链接:https://pan.baidu.com/s/1Bx5lbmHrHxEBMFJTySp7TQ
提取码:qtyt
–来自百度网盘超级会员V6的分享

然后这是使用的matlab代码

clc
close all
clear
mdlName = 'model';
%参数标准值
b1_ref = 1;
b2_ref = 1;
a11_ref = 0.4;
a12_ref = 0.4;
a21_ref = 0.2;
a22_ref = 0.2;

b1_test = 0;
b2_test = 0;
a11_test = 0;
a12_test = 0;
a21_test = 0;
a22_test = 0;


% 参数范围,按照b1,b2,a11,a12,a21,a22的顺序
lb = [0,0,0,0,0,0];
ub = [2,2,1,1,0.5,0.5];

% 种群数量
popSize = 50;

% 迭代次数
maxGen = 100;

% 交叉率
crossRate = 0.9;

% 变异率
mutationRate = 0.1;

% 初始化种群
pop = rand(popSize,6).*(ub-lb)+lb;
fitness = zeros(popSize,maxGen+1);
n = 0;%记录最优适应度相同的次数
fitnessmax = 0;%记录最优适应度
% 迭代
for i = 1:maxGen
    mutationRate = 0.1;
    
    
    for j = 1:popSize
        b1 = pop(j,1);
        b2 = pop(j,2);
        a11 = pop(j,3);
        a12 = pop(j,4);
        a21 = pop(j,5);
        a22 = pop(j,6);

        % 评估适应度
        load_system(mdlName);
        cs = getActiveConfigSet(mdlName);
        model_cs = cs.copy;
        simOut = sim(mdlName,model_cs);
        x1 = simOut.logsout{1}.Values.Data;
        x2 = simOut.logsout{2}.Values.Data;
        x1_ref = simOut.logsout{3}.Values.Data;
        x2_ref = simOut.logsout{4}.Values.Data;
        fitness(j,i) = fun(x1,x1_ref,x2,x2_ref);
    end
    
    % 选择操作
    [~,index] = sort(fitness(:,i));
    if fitnessmax == fitness(index(1))
        n = n+1;
    else
        n = 0;
    end
    fitnessmax = fitness(index(1));%更新最佳适应度
    parents = pop(index(1:popSize/2),:);
    
    % 交叉操作
    offsprings = zeros(popSize/2,6);
    for j = 1:popSize/2
        if rand < crossRate
            parent1 = parents(randi(popSize/2),:);
            parent2 = parents(randi(popSize/2),:);
            nums = randperm(6, 3);
            %将两个亲代的三个随机基因进行交换
            for m = 1:length(nums)
                parent1(nums(m)) = parent2(nums(m));
            end
            offsprings(j,:) = parent1;
        else
            offsprings(j,:) = parents(randi(popSize/2),:);
        end
    end
    
    % 变异操作
    if fitnessmax >20 && n == 7%n=7设为阈值
        mutationRate = 0.9;%增大变异概率,进入物种大爆发阶段
        n = 0;
        for k = 5:popSize/2-5
            c = ceil(rand(1,1)*6);
            parents(k,c) = rand(1,1).*(ub(c)-lb(c))+lb(c);
        end
        for k = popSize/2-5:popSize/2
            parents(k,:) = rand(1,6).*(ub-lb)+lb;
        end
    end
    for j = 1:popSize/2
        if rand < mutationRate
            c = ceil(rand(1,1)*6);
            offsprings(j,c) = rand(1,1).*(ub(c)-lb(c))+lb(c);
        end
    end
    offsprings(end,:) = rand(1,6).*(ub-lb)+lb;
    % 合并新一代种群
    pop = [parents;offsprings]; 
%     fitness(:,i)
     i
%     n
end

% 返回最优解

 for j = 1:popSize
        b1 = pop(j,1);
        b2 = pop(j,2);
        a11 = pop(j,3);
        a12 = pop(j,4);
        a21 = pop(j,5);
        a22 = pop(j,6);

        % 评估适应度
        load_system(mdlName);
        cs = getActiveConfigSet(mdlName);
        model_cs = cs.copy;
        simOut = sim(mdlName,model_cs);
        x1 = simOut.logsout{1}.Values.Data;
        x2 = simOut.logsout{2}.Values.Data;
        x1_ref = simOut.logsout{3}.Values.Data;
        x2_ref = simOut.logsout{4}.Values.Data;
        fitness(j,end) = fun(x1,x1_ref,x2,x2_ref);
end

[~,index] = min(fitness(:,end));
x = pop(index,:);
b1_test = x(1);
b2_test = x(2);
a11_test = x(3);
a12_test = x(4);
a21_test = x(5);
a22_test = x(6);
load_system(mdlName);
cs = getActiveConfigSet(mdlName);
model_cs = cs.copy;
simOut = sim(mdlName,model_cs);


plot(fitness(1,:),'LineWidth',3)
xlabel('迭代次数')
ylabel('适应度值')

不好意思忘记放里面适应度的计算函数了,其实就是误差啦。这是fun函数的写法。

function e =fun(x1,x1_ref,x2,x2_ref)
    e1 = (sum((x1-x1_ref).*(x1-x1_ref)))^(0.5);
    e2 = (sum((x2-x2_ref).*(x2-x2_ref)))^(0.5);
    e = (e1+e2);
end




MatlabGUI调用Simulink编译成可执行的exe文件的解决方法-GUIDE_fig.fig 我(们)曾经N次遇到过这样的提问: “为什么GUI里如果使用sim, simset等函数时,就不能编译成可执行的exe文件发布呢?” 我们也解释过很多次,原因是Matlab的compiler不支持sim等与simulink相关的函数,同样,比如说神经网络相关的函数也不支持。 然而,GUI和Simulink混合编程,是可以编译成可执行exe文件的,使用Matlab自带的RTbuilder工具箱函数编译即可。 使用方法是:先使用RTW把simulink编译成exe文件,然后与GUI一起编译(GUI可以和exe文件一起编译的) 当然,这个时候请特别注意:不需要在GUI里使用sim函数了,流程是这样的: 1:设计GUI回调函数的时候,把GUI传递的参数传递给Simulink时,不要直接使用simset等函数,而是把参数写到一个mat文件里,比如: x = [0.2 handles.In1 handles.In2]'; save Input.mat x 2:设计Simulink模型的时候,记得让simulink从mat文件里读取参数(就是刚刚GUI写入的参数),同样,输出参数也写到mat文件里,(如output.mat), 比如: Matlab57.jpg Matlab GUI调用Simulink,编译成可执行的exe文件的解决方法 3:在GUI回调函数里,不要直接使用sim命令,而是直接调用exe文件simulink模型编译 好的exe文件) !SL_model.exe 4:如果要在GUI上面显示参数,直接读取output.mat文件即可: load Output.mat set)) guidata 现在大家对整个流程应该熟悉了吧? 也就是Matlab GUI与Simulink设计的程序,照样可以编译成exe文件发布... 件里为用到的.m, ,fig和mdl文件,下载试一下如下命令: GUIDE_fig.fig Matlab GUI调用Simulink,编译成可执行的exe文件的解决方法 GUIDE_fig.m Matlab GUI调用Simulink,编译成可执行的exe文件的解决方法 SL_model.mdl Matlab GUI调用Simulink,编译成可执行的exe文件的解决方法 x = [0 0 0]'; save Input.mat x rtwbuild mcc -m GUIDE_fig.m -a SL_model.exe 注明:以上文件均来自Mathworks公司提供,Matlab中文论坛翻译整理。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值