声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 966|回复: 5

[编程技巧] 求助为何程序出现死循环

[复制链接]
发表于 2008-1-9 10:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
w=[4:0.2:8];
Hlw=1/sqrt(8);
m=1;
c=0.1;
k=1;
r=5;
a=0.3;
a1=1;
a3=1;
error1=1;
error3=1;
ux1=0;%上面是赋的各项初值
while error1>0.001|error3>0.001
      for i=1:21
        Hw(i)=1/(-w(i)^2*m+sqrt(-1)*w(i)*c+k+a1);%H(w)
        Hx1(i)=Hlw*Hw(i);%一次传递函数
        Chx1(i)=conj(Hx1(i));%w为负时一次传递函数
      end  
      for i=1:21
          for j=1:21
              Hfw(i,j)=-a3*Hx1(i)*Hx1(j);%Hf(w1,w2)
              Hfw1(i,j)=-a3*(1/(-w(i)^2*m-sqrt(-1)*w(i)*c+k+a1))*Hx1(j);%正负
              CHfw(i,j)=conj(Hfw(i,j));%2负
              Hx2(i,j)=1/(-(w(i)+w(j))^2*m+sqrt(-1)*(w(i)+w(j))*c+k+a1)*Hfw(i,j);%二次传递函数
              Hx21(i,j)=1/(-(w(i)+w(j))^2*m+sqrt(-1)*(w(i)+w(j))*c+k+a1)*Hfw1(i,j);%一正一负
              Hx22(i,j)=1/(-(w(i)+w(j))^2*m+sqrt(-1)*(w(i)+w(j))*c+k+a1)*CHfw(i,j);%全为负           
          end
      end
    ux21=0;
    ux22=0;
    ux31=0;
    ux32=0;
    for i=1:21
        ux21=ux21+2*(abs(Hx1(i)))^2*0.2;
        for j=1:21
            ux22=ux22+2*(abs(Hx2(i,j)))^2*0.04+4*(abs(Hx21(i,j)))^2*0.04+2*(abs(Hx22(i,j)))^2*0.04;
            ux31=ux31+6*conj(Hx1(i))*conj(Hx1(j))*Hx2(i,j)*0.04+12*Hx1(i)*conj(Hx1(j))*Hx21(i,j)*0.04+6*Hx1(i)*Hx1(j)*Hx22(i,j)*0.04;
           for k=1:21
               ux32=ux32+8*conj(Hx2(i,j))*Hx21(i,k)*Hx2(j,k)*0.008+8*conj(Hx2(i,j))*Hx2(i,k)*Hx21(j,k)*0.008+8*conj(Hx21(i,j))*Hx21(i,k)*Hx21(j,k)*0.008+8*conj(Hx21(i,j))*Hx2(i,k)*Hx22(j,k)*0.008+8*conj(Hx21(i,j))*Hx22(i,k)*Hx2(j,k)*0.008+8*conj(Hx22(i,j))*Hx21(i,k)*Hx21(j,k)*0.008+8*conj(Hx21(i,j))*Hx21(i,k)*Hx21(j,k)*0.008+8*conj(Hx22(i,j))*Hx21(i,k)*Hx22(j,k)*0.008;
           end
        end
    end
   ux2=ux21+ux22;
   ux22=sqrt(ux2);
   ux3=ux31+ux32;
   a1=(a-ux1)/sqrt(ux2);
   q1=erf(real(a1/sqrt(2)));
   q2=1/sqrt(2*pi)*exp(-1/2*a1^2);
    I0=2*r*ux2*((a1^2+1)*q1+a1*q2)
    I1=4*r*ux2^(3/2)*(a1*q1+q2);
    I2=2*r*ux2^2*((a1^2+3)*q1+a1*q2);
    I3=4*ux2^(5/2)*(3*a1*q1+4*q2)
    I4=2*r*(ux2)^3*(3*(a1^2+5)*q1+a1*q2);
    I5=4*r*(ux2)^(7/2)*(15*a1*q1+(a1^2+24)*q2);
    E0=I0-1/2*ux3/ux2^2*I1+1/6*ux3/ux2^3*I3
    E1=I1-1/2*ux3/ux2^2*I2+1/6*ux3/ux2^3*I4;
    E2=I2-1/2*ux3/ux2^2*I3+1/6*ux3/ux2^3*I5;
   a31=(E1*ux3-E2*ux2+E0*ux2^2)/(ux3^2-2*ux2^3);
    error3=abs(double(a31-a3));
    a3=a31;
   a11=(E1-((E1*ux3-E2*ux2+E0*ux2^2)/(ux3^2-2*ux2^3))*ux3)/ux2;
  error2=abs(double(a11-a1));
   a1=a11;
    ux1=0.1-E0;
end   
我直接把程序贴上了,我运行的时候老是出现死循环,数值越来越大。不知道哪个地方出现了问题!希望编程高手不吝赐教!谢谢

[ 本帖最后由 eight 于 2008-1-9 10:39 编辑 ]
回复
分享到:

使用道具 举报

发表于 2008-1-9 10:42 | 显示全部楼层
原帖由 upc_z 于 2008-1-9 10:35 发表
w=[4:0.2:8];
Hlw=1/sqrt(8);
m=1;
c=0.1;
k=1;
r=5;
a=0.3;
a1=1;
a3=1;
error1=1;
error3=1;
ux1=0;%上面是赋的各项初值
while error1>0.001|error3>0.001
      for i=1:21
        Hw(i)=1/(-w(i) ...


你的代码有多少个循环就检查一下便可。建议:
1. 使用 smart indent 排版,否则代码很难阅读
2. 自己调试,必要时使用断点。
3. while error1>0.001|error3>0.001 估计是这个循环问题

如果遇到不明白的地方,多自己动手,多看看本版置顶帖
发表于 2008-1-9 10:43 | 显示全部楼层

回复 楼主 的帖子

应该是你最外面的循环条件不满足
 楼主| 发表于 2008-1-9 10:47 | 显示全部楼层

回复 2楼 的帖子

本人是初学者,就是想利用这个程序算出一个方程的解,matlab的一些细节问题我也不是很懂。排版阿断点什么的不懂,你能不能给我仔细看看!非常感谢!!!
 楼主| 发表于 2008-1-9 10:50 | 显示全部楼层

回复 3楼 的帖子

你说的是while循环么?为什么不满足啊!我觉得也是这个问题,因为每循环一次里面变量的值就会增加许多!可是我不知道什么原因。能不能帮我看一眼,非常感谢!!
发表于 2008-1-9 12:31 | 显示全部楼层
1.可能算法不收敛
2. 输入错了
===========
解决方案: 1. 如果是抄别人的程序, 那么程序要全了
          2. 如果是自己写的程序, 那么把思路理清楚. 有些语句压缩一下.或者讨论更简单情形

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-12 23:30 , Processed in 0.149317 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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