hhyyq 发表于 2006-11-17 14:59

求助 非线性求解程序不知错在何

先建立myfun的文件,再用fsolve(求解5个方程5个未知数a1 a2 a3 a4 a5)
function q=myfun(p)
a1=p(1);
a2=p(2);
a3=p(3);
a4=p(4);
a5=p(5);
X=;
Z=[-20,+20,+20,-20;-20,+20,+20,-20;-20,+20,+20,-20;-20,+20,+20,-20;-20,+20,+20,-20;-20,+20,+20,-20;-20,+20,+20,-20;-20,+20,+20,-20;-20,+20,+20,-20;-20,+20,+20,-20;-20,+20,+20,-20;-20,+20,+20,-20];
Y=[-5,-5,+5,+5;-5,-5,5,5;-5,-5,5,5;-5,-5,5,5;-5,-5,5,5;-5,-5,5,5;-5,-5,5,5;-5,-5,5,5;-5,-5,5,5;-5,-5,5,5;-5,-5,5,5;-5,-5,5,5];
f=0.52;
da=4.8;
gama=45*pi/180;
numda=2e-6;
cb=1.5016e+005;
fy=5.142e+003;
ma=-1.637e+005;
mb=1.27e+004;
fz=2.084e+004;
mc=-8.684e+003;
for i=1:1:12
    for j=1:1:4
Sy(i,j)=a1+a2*X(i,j)+a3*Z(i,j);
Sz(i,j)=a4+a5*X(i,j)-a3*Y(i,j);
Vy(i,j)=(2*f-1)*da*sin(gama)+Sy(i,j);
Vz(i,j)=(2*f-1)*da*cos(gama)b+Sz(i,j);
S(i,j)=sqrt(Vy(i,j)^2+Vz(i,j)^2)-(2*f-1)*da+numda;
P(i,j)=cb*S(i,j)^1.5;
b(i,j)=atan(Vy(i,j)/Vz(i,j));
A1(i,j)=P(i,j)*sin(b(i,j));
A2(i,j)=P(i,j)*sin(b(i,j))*X(i,j);
A3(i,j)=P(i,j)*cos(b(i,j))*X(i,j);
A4(i,j)=P(i,j)*cos(b(i,j));
A5(i,j)=P(i,j)*cos(b(i,j))*Y(i,j)-P(i,j)*sin(b(i,j))*Z(i,j);
    end
end
q(1)=sum(A1)-fy;
q(2)=sum(A2)-ma;
q(3)=sum(A3)-mb;
q(4)=sum(A4)-fz;
q(5)=sum(A5)-mc;

hhyyq 发表于 2006-11-17 15:01

最后调用函数,求解a1=fsolve(@myfun,,optimset('Display','off'))
请各位大侠看看 错在什么地方了
学的比较浅 没什么编程技巧可言
先谢谢各位了

xjzuo 发表于 2006-11-17 19:39

回复

问题如下:
       1.Vz(i,j)=(2*f-1)*da*cos(gama)b+Sz(i,j); %%% b去掉.
       2.q(1)=sum(A1)-fy;q(2)=...... %%% 向量不能赋值给标量.
最好还是说明一下q的意义.

猜了一下你的意思,求出的结果如下,不知是否是你所希望的值:
a1 =
   0.0993 + 0.0361i-0.0015 - 0.0006i   0.0000 - 0.0000i-0.1185 - 0.1449i   0.0016 + 0.0029i

hhyyq 发表于 2006-11-18 15:29

您好.q是一个方程.我是按一个非线性方程的例子那样写的.q(1)=sum(A1)-fy=0;你提到的向量不能直接赋值,那该如何解决呢?最后求出来的值应该是接近a1=0.01;a2=a3=a5=0.001;a4=0.01;可否详细的指导一下.

happy 发表于 2006-11-18 16:19

原帖由 hhyyq 于 2006-11-18 15:29 发表
您好.q是一个方程.我是按一个非线性方程的例子那样写的.q(1)=sum(A1)-fy=0;你提到的向量不能直接赋值,那该如何解决呢?最后求出来的值应该是接近a1=0.01;a2=a3=a5=0.001;a4=0.01;可否详细的指导一下.


sum(A1)值得是对A1中所有的列求和
不知道这个是否是你要的

如果是对整个矩阵求和应该是sum(A1(:))

hhyyq 发表于 2006-11-18 16:47

是对整个矩阵求和

hhyyq 发表于 2006-11-18 16:49

1.Vz(i,j)=(2*f-1)*da*cos(gama)b+Sz(i,j); %%% b去掉.
这个是错了 能否给我改一下程序 多谢

hhyyq 发表于 2006-11-18 17:04

我把你们指出来的错误都改了 出来的结果和上面的那位大侠一样的0.0993 + 0.0361i-0.0015 - 0.0006i   0.0000 - 0.0000i-0.1185 - 0.1449i   0.0016 + 0.0029i但是和我想要的值相差太大了 我想请问一下 我这种的解题思路 有没有错 ?是否和取得初始值也有关系?

xjzuo 发表于 2006-11-18 19:29

回复

程序的问题只能到此了.
fsolve有时候对初值是很敏感的,所以有时候可以先画出图形看看.
如果要进一步修改你的程序,可能需要你再稍微详细点描述一下你的问题了.
页: [1]
查看完整版本: 求助 非线性求解程序不知错在何