平猪 发表于 2009-4-21 15:34

【求助】程序出现Matrix is close to singular or badly scaled 错误提示

我运行程序之后就会出现如下的提示,即使我改变了初值,情况还是一样

Warning: Matrix is close to singular or badly scaled.
         Results may be inaccurate. RCOND = 1.615894e-025.
> In Broy at 13
Warning: Matrix is close to singular or badly scaled.
         Results may be inaccurate. RCOND = 5.214373e-064.
> In Broy at 13
Warning: Matrix is close to singular or badly scaled.
         Results may be inaccurate. RCOND = 1.299181e-176.
> In Broy at 13
Warning: Matrix is singular, close to singular or badly scaled.
         Results may be inaccurate. RCOND = NaN.
> In Broy at 13

我的三段程序如下:
第一段程序:Broy.m
(这是Broyden迭代法的M文件,我已经试过了,解其他的非线性方程组都没有错,有的大虾说第9行可能有错,不过这也我试过了,即使使用点乘,一样是错的)
function =Broy(x0,eps)
if nargin==1, eps=1.0e-6;
elseif nargin<1, error; return
end
A=eye(length(x0)); x1=x0-bf(x0)/A; n=1;
while (norm(x1-x0)>=1e-6)&(n<=10000)
    x0=x1; x1=x0-bf(x0)/A; p=x1-x0; q=bf(x1)-bf(x0);
    A=A+(q-p*A)'*p/norm(p); n=n+1;
end
y=x1;

第二段程序:bf.m
functiony=bf(x)
global Fl1 Fs1 Fi Fcz Uf Fl2 Fs2i o4 o5 Fcf L l Lc dz
y(1)=(x(1)-Fl2-Fs2i)*o5-x(2)+x(3)-Fcf;
y(2)=Fl1+Fs1+Fi+Fcz+Uf*(x(2)+x(3))-(x(1)-Fl2-Fs2i)*o4;
y(3)=x(2)*(L-l+x(4)/3)-x(3)*(L-x(5)/3)-Fcf*Lc-Uf*x(2)*dz/2+Uf*x(3)*dz/2;
y(4)=x(2)*x(5)*x(5)-x(3)*x(4)*x(4);
y(5)=l-x(4)-x(5);
y=;

第三段程序:bf.m
L=0.18; dz=0.0238; Lc=0.02; Uf=0.1; a=0.25; c=0.2; fai=pi/180*7.5; o2=pi/12;
n=3000; pin=550000; pout=8240000; o1=pi/180*10; miu0=1672; miu=0.6;
rou1=800; R1=0.015; R2=0.04; m=0.08; Ks1=2860; L0=0.02; Smax=0.0235;
Ks2=5000; l0=0.078; L02=0.01; L2=0.005; Z=7; k=0.02; RR=0.05; d2=0.02675; w=n*pi/30;
R0=sqrt(a^2+c^2-2*a*c*cos(fai)); u1=(a-c*cos(fai))/(c*sin(fai)); t=atan(u1); j=R0/L;
A=cos(o1)*sin(t); B=-cos(t)*sin(o1); G=j^2*B^2; E=j*B*(1+j*A);
D=1+j*A-0.5*j^2*(1-A^2-0.5*B^2);
rou=L*(D+E*cos(o2)+0.25*G*cos(2*o2));
S=L*(E*(cos(02)-1)+0.25*G*(cos(2*o2)-1));
a1=-w*w*L*(E*cos(o2)+G*cos(2*o2));
if o2<=pi, p=pin; else p=pout; end
o4=(rou*rou+L*L-R0*R0)/(2*rou*L); o5=sqrt(1-o4^2);
pr=pin+rou1*(R1*R1-R2*R2)*w*w/2;
Fl1=pi*dz*dz*p*0.25; Fl2=0.25*pi*pr*(d2*d2-dz*dz*cos(fai)); Fi=-m*a1;
Fs1=Ks1*(L0+Smax-S); Fs2=Ks2*(L02-L2);
Fs2f=Fs2/cos(fai); Fs2i=Fs2f/(Z*cos(o1));
Fcz=m*w*w*(rou-k)*sin(o1)*sin(o1);
Fcf=m*w*w*(rou-k)*sin(o1)*cos(o1); l=l0-S;
x0=; =Broy(x0);

很着急,在线等大虾们交流,谢谢,:handshake

[ 本帖最后由 ChaChing 于 2010-6-2 22:37 编辑 ]

ChaChing 发表于 2009-4-21 20:50

回复 楼主 平猪 的帖子

LZ的矩阵的确singular了!
bf(x0)/A代表的意思是bf(x0)*inv(A), A矩阵出singular问题了!
总觉得LZ是流程没确定, 怎还会有"即使使用点乘"的问题?
不应该乱试! 应该确定LZ要什麽!

平猪 发表于 2009-4-22 09:52

回复 沙发 ChaChing 的帖子

我觉得“x1=x0-bf(x0)/A;”应该是“x1=x0-A\bf(x0);”
但改过后依然提示:
??? Error using ==> mldivide
Matrix dimensions must agree.

Error in ==> Broy at 13
    x1=x0-A\bf(x0);

这些程序的目的就是求解bf.m中的非线性方程组的解

sigma665 发表于 2009-4-22 09:56

x1=x0-A.\bf(x0);

平猪 发表于 2009-4-22 10:22

回复 地板 sigma665 的帖子

??? Error using ==> ldivide
Matrix dimensions must agree.

Error in ==> Broy at 13
    x1=x0-A.\bf(x0);

ChaChing 发表于 2009-4-22 15:50

确定LZ的流程应该如何吧! 怎麽可以随意试?

purple_paradise 发表于 2010-6-2 16:44

可以用 warning off 关闭掉,要是那个 误差很小的话

ChaChing 发表于 2010-6-2 22:30

回复 7楼 purple_paradise 的帖子

个人不建议关闭warning!:loveliness:
页: [1]
查看完整版本: 【求助】程序出现Matrix is close to singular or badly scaled 错误提示