找回密码
 注册
Simdroid-非首页
查看: 118|回复: 3

【很急】求教MATLAB循环语句使用问题

[复制链接]
发表于 2011-6-3 16:55:46 | 显示全部楼层 |阅读模式 来自 湖北荆州
在f=f1.*a1.*(1+a.*B+c*p)*(10^(-3));error=f./f4;average=mean(error,1)(误差平均值)。
其中f1,a1,B,p,f4均为已知的12*1的矩阵,a,c均为变量,a的取值为a=0:0.1:3,c的取值为c=0:0.1:3,要求得出a,c在不同取值搭配的情况下,误差平均值的变化曲线,即plot3('a','c','average').
我在写程序的时候用的事while循环,可是我用while循环计算的东西在end后只能 得到循环语句里面最后一次计算的结果 我现在希望得到每次循环计算的结果 然后将他们组成一个矩阵  有没有人会啊 教下我啊。下面我初步写的程序,希望有人能帮我 指点我一下
a=0;
c=0;
while (a<3)
    a=a+0.1;
    while(c<5)
        c=c+0.1;
a1=T(:,3);
a2=T(:,4);
a3=T(:,5);
f1=T(:,9);
f2=T(:,6);
f3=T(:,7);
B=T(:,2);
p=T(:,1);
f4=T(:,10);
f=f1.*a1.*(1+a.*B+p)*(10^(-3));
error=f./f4;
average=mean(error,1);
er=abs(average-1);
av2=(error-average).^2;
var=(sum(av2)/12)^0.5;
l=var/average
    end
end
下面是我T矩阵的数据。

0.4571820.9976612601826461336336.6667305.5556301.902834.318892188.3
0.4727731.2399682516035041336305.5556305.5556301.902834.318892592
0.4892231.6160742431443501336310305.5556301.902834.318892644
0.6685451.0220152539826461956336.6667297.9167301.902834.318892476.5
0.691921.2712952454035041956305.5556297.9167301.902834.318892795.5
0.7166251.6583622369443501956310297.9167301.902834.318892998.5
0.7749711.0462372481026462544336.6667259.375301.902834.318892696.5
0.8027311.3025052395235042544305.5556259.375301.902834.318892471.5
0.8321221.7005642310643502544310259.375301.902834.318893002
0.4727731.2399682516035041336305.5556305.5556301.902834.318892397
0.691921.2712952454035041956305.5556297.9167301.902834.318892730
0.8027311.3025052395235042544305.5556259.375301.902834.318892973
发表于 2011-6-3 19:50:51 | 显示全部楼层 来自 湖南湘潭
Simdroid开发平台
这是基本的编程问题,与Matlab无关。
但是修改后的程序还是出现了一些问题(见程序注释),是Bug,还是其它因素?

clear all;
clc;

T = [
    0.457182        0.997661        26018         2646        1336         336.6667        305.5556        301.9028        34.31889        2188.3
    0.472773        1.239968        25160         3504        1336         305.5556        305.5556        301.9028        34.31889        2592
    0.489223        1.616074        24314         4350        1336         310                        305.5556        301.9028        34.31889        2644
    0.668545        1.022015        25398         2646        1956         336.6667        297.9167        301.9028        34.31889        2476.5
    0.69192                1.271295        24540         3504        1956         305.5556        297.9167        301.9028        34.31889        2795.5
    0.716625        1.658362        23694         4350        1956        310         297.9167        301.9028        34.31889        2998.5
    0.774971        1.046237        24810         2646        2544        336.6667        259.375                301.9028        34.31889        2696.5
    0.802731        1.302505        23952         3504        2544         305.5556        259.375                301.9028        34.31889        2471.5
    0.832122        1.700564        23106         4350        2544        310         259.375                301.9028        34.31889        3002
    0.472773        1.239968        25160         3504        1336         305.5556        305.5556        301.9028        34.31889        2397
    0.69192                1.271295        24540         3504        1956         305.5556        297.9167        301.9028        34.31889        2730
    0.802731        1.302505        23952         3504        2544         305.5556        259.375                301.9028        34.31889        2973
    ];

a = 0;
m = 1;
while (a<3)
    c = 0;
    n = 1;
    while(c<5)  % 理论上讲应该只有50个数据,c = 5的时候,不满足条件退出,所以有效个数为50.
        a1 = T(:,3);  % 但实际上循环到 c = 5 时,c<5的值仍然为1.呵呵???
        a2 = T(:,4);  % 将循环条件改为(c<5-eps)也不行?!
        a3 = T(:,5);  % Matlab版本2009b
        f1 = T(:,9);  % 单独试验 c = 0:0.1:5, c(end)<5 逻辑值为0,是正确的。邪乎?
        f2 = T(:,6);
        f3 = T(:,7);
        B = T(:,2);
        p = T(:,1);
        f4 = T(:,10);
        f = f1 .* a1 .* (1 + a*B + c*p) * (10^(-3));
        error = f ./ f4;
        average = mean(error, 1);
        er = abs(average-1);
        av2 = (error-average).^2;
        var = (sum(av2)/12)^0.5;
        l(m,n) = var / average;
        c = c + 0.1;
        n = n + 1;
    end
    a = a + 0.1;
    m = m + 1;
end

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-3 22:05:10 | 显示全部楼层 来自 湖北荆州
2# lin2009
呵呵  大哥 谢谢你的帮助  我在仔细看看哈 辛苦啦
回复 不支持

使用道具 举报

发表于 2011-6-28 11:59:11 | 显示全部楼层 来自 台湾
2# lin2009
个人水平有限, 确实原因也不是很确定, 仅猜测是c=c+0.1重覆加的动作造成累计误差吧!?
工程使用上, 为避免存在这种问题而不自知, 习惯上我会使用一小量值
c=0; while(abs(c-5)>10^-10), c = c + 0.1; end; c

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-9-20 20:19 , Processed in 0.049455 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表