Matlab基础编程知识处理(2)(数学建模中模型的模拟与数据提取,本篇全干货)

今天我终于没有再当鸽子了.

如何提取运算中的数值信息

这里主要是介绍矩阵存储数据的思想.
先假设一个情形:
我在分析模拟电网波动时,想了解究竟有多少次电频率超过我设置的舒适值,那么我该如何统计超过的次数呢?
首先先放上我对电网频率的模拟代码(使用了自回归模型,随机模型使用的是常用的高斯函数)
(一些参数的设置是通过参考文献算出来的)
参数设置声明:
x的值是横坐标
a的值是电网频率
C用来储存a的值的矩阵

clc;clear all;
x=1:1000;
C=[50];a=50;
for i=1:999 
%注意之所以只执行999次是因为在plot中x的量要与C的量相同,而x有1000,C中原本就有一个
a=6.698+0.866*a+normrnd(0,0.1);
C=[C,a];
end
plot(x,C,'color','k')
hold on;
line([0,1001],[49.9,49.9],'color','R','linestyle','--');
line([0,1001],[50.1,50.1],'color','R','linestyle','--');
xlim([0,1001]);
ylim([49,51]);
xlabel('Sigma=0.1')

效果图
在这里插入图片描述

开头的clc是用来清空运行栏的,clear all是用来清空参数的.
(我将能让用户感到频率波动的前提条件设置为波动在49.9-50.1外)
那么我们该如何提取这些不在范围内的值的出现次数呢?
在前文我们提到了变量的可自我迭代性,我们就用一个变量来做文章就行了.
不多bb,直接开始改进.

clc;clear all;
I=0;
x=1:1000;
C=[50];a=50;
for i=1:999
    a=6.698+0.866*a+normrnd(0,0.1);
    C=[C,a];
    if abs(a-50) > 0.1
        I = I + 1
    end
    
end
plot(x,C,'color','k')
hold on;
line([0,1001],[49.9,49.9],'color','R','linestyle','--');
line([0,1001],[50.1,50.1],'color','R','linestyle','--');
xlim([0,1001]);
ylim([49,51]);
xlabel('Sigma=0.1')

为了计数,我们设置了变量I,利用I的自我累加来达到计数的目的.
另外,if里面是可以嵌套if的,但是这样的话一旦嵌套多了,就会出现运行效率低下的问题,当然,初学者不需要考虑这个问题.
那么你学会了吗?
这是最基础的数据统计问题,那么,如果我们想要知道究竟是哪几次数据出现了偏离,我们该怎么办?
这时,我们就可以构造一个矩阵来储存这些数据了.
直接给出代码.

clc;clear all;
I=[];
x=1:1000;
C=[50];a=50;
for i=1:999
    a=6.698+0.866*a+normrnd(0,0.1);
    C=[C,a];
    if abs(a-50) > 0.1
        I = [I,i]
    end
    
end
plot(x,C,'color','k')
hold on;
line([0,1001],[49.9,49.9],'color','R','linestyle','--');
line([0,1001],[50.1,50.1],'color','R','linestyle','--');
xlim([0,1001]);
ylim([49,51]);
xlabel('Sigma=0.1')

这次我们的I变成了一个矩阵,用来储存数据.
通过if的逻辑判断,我们成功将所有的偏离数据收集起来了.
这也是一道基础问题.
那么,我想了解下每次偏离的时候会连续出现多久,是否可以统计出来呢?
当然可以.
这就需要我们对I的矩阵元素进行判别(连续与非连续)
那么我就用最简单易懂的逻辑为你概述下我们该如何判断
(可以当练手题目试着做做)
附上我的长的过分if都到爆炸的代码

clc;clear all;
C=[ ];a=50;
for i=1:1000
    a=6.698+0.866*a+normrnd(0,0.1);
    if abs(a-50) >0.1
    C=[C,i]
    end
end
c=numel(C)
a=0;Q=0;W=0;E=0;R=0;T=0;
for i=2:c
    if C(i) - C(i-1) == 1
        a = a + 1
    else
        if a==0
            Q=Q+1
        end
        if a==1
            W=W+1
        end
        if a==2
            E=E+1
        end
        if a==3
            R=R+1
        end
        if a>=4
        T=T+1
        end
        a=0
    end
end

几点改变:
1.此处的C储存的值不再是a的值,而是改为储存了i的值,因为我们要算的不是数据的离散程度,而是要储存偏离数据出现时对应的时间段.
2.numel函数是用来计算C的元素个数的,避免出现因为超出C的元素而出现的报错
3.这里设置了几个值用来分别储存连续偏离的时间,一步到位.
4.至于QWERT这五个变量,随便改,开心就好

那么,课后作业来了:
请问我想评估一下用户的满意程度,我该如何评估比较好,并自己写出代码,说服自己.

本题目的背景来源于IMMC冬季赛2019

明天将给出我自己的处理方法喽.

今天就这样吧,我顺便今天把latex语言欠更n个月的文章更新掉算了.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值