余公 发表于 2011-6-3 16:55:46

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

在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.30.4727731.2399682516035041336305.5556305.5556301.902834.3188925920.4892231.6160742431443501336310305.5556301.902834.3188926440.6685451.0220152539826461956336.6667297.9167301.902834.318892476.50.691921.2712952454035041956305.5556297.9167301.902834.318892795.50.7166251.6583622369443501956310297.9167301.902834.318892998.50.7749711.0462372481026462544336.6667259.375301.902834.318892696.50.8027311.3025052395235042544305.5556259.375301.902834.318892471.50.8321221.7005642310643502544310259.375301.902834.3188930020.4727731.2399682516035041336305.5556305.5556301.902834.3188923970.691921.2712952454035041956305.5556297.9167301.902834.3188927300.8027311.3025052395235042544305.5556259.375301.902834.318892973

lin2009 发表于 2011-6-3 19:50:51

这是基本的编程问题,与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

余公 发表于 2011-6-3 22:05:10

2# lin2009
呵呵大哥 谢谢你的帮助我在仔细看看哈 辛苦啦

ChaChing 发表于 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]
查看完整版本: 【很急】求教MATLAB循环语句使用问题