dunmin 发表于 2007-10-2 15:38

??? In an assignment A(:) = B, the number of elements in A and B

程序如下:
1):cali_fun_070826_5.m
function z=cali_fun_070826_5(x)
clc
%标定时参数c=
c=
L1=c(1);L2=c(2);qc=c(3);xp0=c(4);yp0=c(5);m=c(6);n=c(7);dm=c(8);dn=c(9);q1z=c(10);q2z=c(11);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%待标定参数q1z,q2z,qc,xp0,yp0,
%载入测量点的关节角度
encoder=load('ctest2');
=size(encoder)
%计算关节转角
for i=0:(rencoder-1)
    qa1(i+1,1)=encoder(i+1,1);
    qa2(i+1,1)=encoder(i+1,2)+x(1)/180*pi;
    w(i+1,1)=x(3)*cos(qa1(i+1,1))+x(4)*cos(qa1(i+1,1)+qa2(i+1,1))-rem(i,n)*dn*cos(x(2)/180*pi)+fix(i/n)*dm*sin(x(2)/180*pi);
    %w(i+1,2)=x(3)*sin(qa1(i+1,1))+x(4)*sin(qa1(i+1,1)+qa2(i+1,1))-rem(i,n)*dn*sin(x(2)/180*pi)-fix(i/n)*dm*cos(x(2)/180*pi);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:(rencoder-1)
    z(i,1)=w(i+1,1)-w(i,1);
    %z(i,2)=w(i+1,2)-w(i,2);
end

2)程序2
clc
disp(('>>标定运算中................'))
=ga(@cali_fun_070826_5,4);
%查看标定结果。
x,fval,reason

ctest2为40行2列的已知数据,程序2运行后出现如下错误提示:
??? In an assignmentA(:) = B, the number of elements in A and B
must be the same.

Error in ==> ga at 188
            state.Score(thisPopulation) = score;

Error in ==> cali_ga_070910_1 at 6
=ga(@cali_fun_070826_5,4);
不知道怎么修改,哪位行家帮着看看,怎么解决,谢谢!

花如月 发表于 2007-10-2 16:21

赋值的时候出错,数据大小不一致。

dunmin 发表于 2007-10-2 22:49

但是如果不用遗传算法((ga),而使用fsolve则就可以解出结果。说明问题出在ga上。程序相当于数值逆合(或参数辨识),待辨识量有4个,测试数据40个。

eight 发表于 2007-10-3 10:12

原帖由 dunmin 于 2007-10-2 22:49 发表 http://www.chinavib.com/forum/images/common/back.gif
但是如果不用遗传算法((ga),而使用fsolve则就可以解出结果。说明问题出在ga上。程序相当于数值逆合(或参数辨识),待辨识量有4个,测试数据40个。

先看看 ga 算法的输入有什么要求吧,不要太自以为是。我认为是你的 cali_fun_070826_5 函数的输出与 ga 函数的输入不一致造成的

dunmin 发表于 2007-10-4 00:09

关于遗传算法,我所看的书上举的例子,都是利用ga求最小值。可见如下例子:
1)m文件:ga_fun.m
function z=ga_fun(x)
z=x(1)^2-2*x(1)*x(2)+6*x(1)+x(2)^2-6*x(2);
2)利用GUI或在命令行均可调用函数ga
例如在命令行:
=ga(@ga_fun,2).

以上程序可以运行求出z的最小值。没有问题。但是对于利用ga进行系统辨识,没有找到相应的例子和说明。虽然有很多人使用遗传算法进行了系统辨识,不知道他们是怎么用的。
函数cali_fun_070826_5相当于39个等式,我想利用ga把x(1),x(2),x(3),x(4)辨识出来。不知道怎么才能满足ga的要求,所以就参照fsolve(开始时使用的算法,可惜fsovle的鲁棒性不强,理想情况仿真可以,加上测量误差后,算法就不收敛了,所以想改用遗传算法)。结果不可行,肯定要修改函数cali_fun_070826_5,但是不知道怎么修改,希望得到指教。"说明问题出在ga上",我的意思可不是说ga有问题。只能修改cali_fun_070826_5来适应ga的要求,怎么修改那??

eight 发表于 2007-10-4 10:27

原帖由 dunmin 于 2007-10-4 00:09 发表 http://www.chinavib.com/forum/images/common/back.gif
关于遗传算法,我所看的书上举的例子,都是利用ga求最小值。可见如下例子:
1)m文件:ga_fun.m
function z=ga_fun(x)
z=x(1)^2-2*x(1)*x(2)+6*x(1)+x(2)^2-6*x(2);
2)利用GUI或在命令行均可调用函数ga
例 ...

我对你的遗传算法等背景一窍不通,所以也许实质性的帮忙谈不上。但是从矩阵的角度来看,显然,你举的那个成功例子中, ga_fun 返回值是个标量,即一个数,而你的不成功实例中, cali_fun_070826_5 返回值是一个向量。问题是否出在这个上,请考虑一下

dunmin 发表于 2007-10-4 19:03

谢谢.可能是这个原因.另外,ga好象只能直接求最小值.参数辨识可能不能直接用。

dunmin 发表于 2007-10-4 22:44

将cali_fun_070826_5中的向量各元素求和,变成一个标量,利用ga进行运算,可以运算了。谢谢各位

eight 发表于 2007-10-4 22:54

原帖由 dunmin 于 2007-10-4 22:44 发表 http://www.chinavib.com/forum/images/common/back.gif
将cali_fun_070826_5中的向量各元素求和,变成一个标量,利用ga进行运算,可以运算了。谢谢各位

嗯,解决了就好。其实有时候自己摸索一下就能够找到答案了,更何况你有一个成功的事例,正好可以用来参考

dunmin 发表于 2007-10-5 00:27

谢谢啦,应该是将cali_fun_070826_5中的向量各元素的平方求和,变成一个标量。再求最小值,相当于最小二乘法了。
页: [1]
查看完整版本: ??? In an assignment A(:) = B, the number of elements in A and B