|
本帖最后由 ChaChing 于 2013-5-27 08:55 编辑
以下便是本来要po的东东, 本想算了(没营养又顾人怨!), 但还是…,恳请LZ与看倌包涵了
针对LZ的程序, 其中隐藏了不少问题! 就说说个人自以为是真正解决问题的过程或方式吧
1.建议养成好习惯,多看下Workspace及Help中的资讯
a)若看下Workspace, 就会发现ang是240*2,me是240*1!
b)如此plot(ang,me)其实是画了两条线! 等同plot(ang(:,1),me); hold on; plot(ang(:,2),me); 只不过第二条线几乎与y轴重合了! 可以修改那两个绘图指令成plot(ang,me,'o'); plot(ang,st,'o');便会很容易发现
c)追究ang为何是240*2, 不难发现是ang=[m,1]的错用! 我想LZ是要Preallocation,那就应该是ang=zeros([m,1]);吧!
2.建议多点开变数内容(使用双击)看看!
a)若看过x变数, 不难发现要画的x轴并非单调增加! (或者使用issorted检查)
b)如此是LZ要的吗? 若不是, 是否需考虑下先排序下或不画线!? 排序请help下sort或sortrows, 不画线类似上头检查图形的用法
3.建议养成好习惯,使用函数前先查下help并小试一下
a)若看过asin/acos的help, 不难发现asin/acos的输出范围分别是-pi/2~pi/2及0~pi, 那就需小心使用於各个象限
b)从先排序或不画线下的图形, 不难发现原写法產生非单值对应, 若LZ确认输入为一对一, 那就一定是用错了函数(可别如同某些人竟怀疑matlab函数)
c)要用对函数, 数学底子强的人或许直接即可应用正确, 但若如同个人水平一般的, 也可使用asind(1/2), acosd(1/2),asind(-1/2),acosd(-1/2)检验下, 不是吗
d)原来的逻辑判断未考虑出现零的情况, 很幸运LZ的原始座标点并无此状况
e)建议儘可能採用同一函数判断, 一下asin一下acos, 不是把问题复杂化, 个人以为一般人愈简化愈不会出错
f)另因为asin或acos的范围未含盖全域, 使得必须考虑较多, 若能多花些时间搜下help, 应该可以发现atan2或许更适用, 当然cart2pol及angle应该也可以
4.明明是一维的变数, 干嘛要使用二维的表示方式! 这样程序看起来很复杂, 一复杂化应该就容易出错吧!
5.xlabel('\it\theta^\o')
这些都是不难的错误(因为连老头都查到了), 相信LZ仔细点也可以自我发现! 只不过LZ好像浪费了一次自我排误的经验! 窃以为自我排误经验愈多, 编程能力自然提昇!
- clear; clc;
- load z02ms.dat; x=z02ms(:,1); y=z02ms(:,2); me=z02ms(:,3); st=z02ms(:,4);
- [m,n]=size(z02ms); r=abs(sqrt(x.^2+y.^2)); ang=zeros(m,1);
- for i=1:m, temp=asind(y(i)/r(i)); acs=acosd(y(i)/r(i));
- if x(i)>=0 && y(i)>=0, ang(i)=temp;
- elseif x(i)<0 && y(i)>=0, ang(i)=90+acs; % ang(i)=180-temp;
- elseif x(i)<=0 && y(i)<0, ang(i)=180-temp;
- else ang(i)=450-acs; % ang(i)=360+temp;
- end
- end
- %% ang=atan2(y,x)*180/pi; ii=ang<0; ang(ii)=ang(ii)+360; %3~10行可更改成这一行
- [ang,indx]=sortrows(ang); me=me(indx); st=st(indx);
- subplot 211, plot(ang,me); grid on
- xlabel('\it\theta^\o');ylabel('mean pressure'); title('mean pressure ');
- subplot 212, plot(ang,st); grid on
- xlabel('\it\theta^\o');ylabel('Fluctuating pressure'); title('Fluctuating pressure rms');
复制代码 |
|