声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3377|回复: 9

[综合讨论] ??? In an assignment A(:) = B, the number of elements in A and B

[复制链接]
发表于 2007-10-2 15:38 | 显示全部楼层 |阅读模式

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

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

x
程序如下:
1):cali_fun_070826_5.m
function z=cali_fun_070826_5(x)
clc
%标定时参数c=[L1 L2 qc xp0 yp0 m n dm dn q1z q2z]
c=[270 250 5 280 -140 8 5 40 40 2 2]
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');
[rencoder,lencoder]=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(('>>标定运算中................'))
[x,fval,reason]=ga(@cali_fun_070826_5,4);
%查看标定结果。
x,fval,reason

ctest2为40行2列的已知数据,程序2运行后出现如下错误提示:
??? In an assignment  A(:) = 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
[x,fval,reason]=ga(@cali_fun_070826_5,4);
不知道怎么修改,哪位行家帮着看看,怎么解决,谢谢!
回复
分享到:

使用道具 举报

发表于 2007-10-2 16:21 | 显示全部楼层
赋值的时候出错,数据大小不一致。
 楼主| 发表于 2007-10-2 22:49 | 显示全部楼层
但是如果不用遗传算法((ga),而使用fsolve则就可以解出结果。说明问题出在ga上。程序相当于数值逆合(或参数辨识),待辨识量有4个,测试数据40个。
发表于 2007-10-3 10:12 | 显示全部楼层
原帖由 dunmin 于 2007-10-2 22:49 发表
但是如果不用遗传算法((ga),而使用fsolve则就可以解出结果。说明问题出在ga上。程序相当于数值逆合(或参数辨识),待辨识量有4个,测试数据40个。


先看看 ga 算法的输入有什么要求吧,不要太自以为是。我认为是你的 cali_fun_070826_5 函数的输出与 ga 函数的输入不一致造成的
 楼主| 发表于 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
例如在命令行:
[x fval]=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的要求,怎么修改那??
发表于 2007-10-4 10:27 | 显示全部楼层
原帖由 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_fun 返回值是个标量,即一个数,而你的不成功实例中, cali_fun_070826_5 返回值是一个向量。问题是否出在这个上,请考虑一下

评分

1

查看全部评分

 楼主| 发表于 2007-10-4 19:03 | 显示全部楼层
谢谢.可能是这个原因.另外,ga好象只能直接求最小值.参数辨识可能不能直接用。
 楼主| 发表于 2007-10-4 22:44 | 显示全部楼层
将cali_fun_070826_5中的向量各元素求和,变成一个标量,利用ga进行运算,可以运算了。谢谢各位
发表于 2007-10-4 22:54 | 显示全部楼层
原帖由 dunmin 于 2007-10-4 22:44 发表
将cali_fun_070826_5中的向量各元素求和,变成一个标量,利用ga进行运算,可以运算了。谢谢各位


嗯,解决了就好。其实有时候自己摸索一下就能够找到答案了,更何况你有一个成功的事例,正好可以用来参考
 楼主| 发表于 2007-10-5 00:27 | 显示全部楼层
谢谢啦,应该是将cali_fun_070826_5中的向量各元素的平方求和,变成一个标量。再求最小值,相当于最小二乘法了。

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-14 21:19 , Processed in 0.070500 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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