声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1570|回复: 6

[综合讨论] matlab inline函数的一点疑问

[复制链接]
发表于 2007-11-17 18:11 | 显示全部楼层 |阅读模式

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

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

x
我的原始代码如下:
a=[0 ;0 ;-0.005];
a_dach=[1.1165*10^-7 ;4.8413*10^-5; 8.6100*10^-3];
u0=2.5*10^-5;
D_1=[1 0 0;0 1 0;0 0 1];
syms X1 X2 X3 X4 X5 X6;
T=[X1 X2 X3;0 X4 X5;0 0 X6];
R1=transpose(T)*T;
e_1=(a'*D_1*inv(R1)*D_1*a-2*a_dach'*inv(R1)*D_1*a+a_dach'*inv(R1)*a_dach)/(u0^2);
testFct6 = inline(' -1/sqrt((e_1)^3*det(R1)) ', 'X');
这样调试函数的时候会提示
??? Error using ==> inlineeval
Error in inline expression ==> -1/sqrt((e_1)^3*det(R1))
??? Error using ==> eval
Undefined function or variable 'e_1'.
事实上inline函数必须具备以下的格式,
testFct1 = inline('(X(1)-1)^2 + (X(2)-16)^2 + (X(3)+2)^4 + 5*norm(X(4)) + (X(5)+18)^2 + 10', 'X');
也就是说自变量不能是符合变量,
不知道matlab有没有办法可以把符号变量转换为inline的自变量。
非常期待您的回答

[ 本帖最后由 花如月 于 2007-11-17 18:25 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-11-17 18:25 | 显示全部楼层

回复 #1 cherryliu 的帖子

>> a=[0 ;0 ;-0.005];
a_dach=[1.1165*10^-7 ;4.8413*10^-5; 8.6100*10^-3];
u0=2.5*10^-5;
D_1=[1 0 0;0 1 0;0 0 1];
syms X1 X2 X3 X4 X5 X6;
T=[X1 X2 X3;0 X4 X5;0 0 X6];
R1=transpose(T)*T;
e_1=(a'*D_1*inv(R1)*D_1*a-2*a_dach'*inv(R1)*D_1*a+a_dach'*inv(R1)*a_dach)/(u0^2);
testFct6 = inline(' -1/sqrt((e_1)^3*det(R1)) ', 'X');
>>

在我电脑上完全正常,没有错误
 楼主| 发表于 2007-11-17 18:36 | 显示全部楼层
可能我没有把问题说清楚,这个testFct6将被赋值给主函数里面的一个变量
fitnessFct = testFct6;
而这个fitnessFct要求输入必须是一个6维的列向量,所以在调用这个函数的时候出错了。
不知道有没有什么办法修正一下
发表于 2007-11-17 19:48 | 显示全部楼层

回复 #3 cherryliu 的帖子

%没有办法,看doc inline说明就知道了
%要说输入向量也是分别代入算,例如
fh=inline('x.^2');
fh(1:3)
%所以你只有定义6个参数.
%或者不用inline,用m函数
 楼主| 发表于 2007-11-17 20:13 | 显示全部楼层
原帖由 donkeyxu 于 2007-11-17 19:48 发表
%没有办法,看doc inline说明就知道了
%要说输入向量也是分别代入算,例如
fh=inline('x.^2');
fh(1:3)
%所以你只有定义6个参数.
%或者不用inline,用m函数

testFct1 = inline('(X(1)-1)^2 + (X(2)-16)^2 + (X(3)+2)^4 + 5*norm(X(4)) + (X(5)+18)^2 + 10', 'X');
这个testfunktion执行通过了,没有任何问题。
现在就是我的testFct6= -1/sqrt((e_1)^3*det(R1)) (其中e_1和R1都是关于这个列向量X里面元素X(1)......X(6)的函数)
展开成X(1)......X(6)这种表达形式很麻烦,所以我想先预定义一下,见我前面的代码。
 楼主| 发表于 2007-11-18 00:05 | 显示全部楼层
写出testFct1这种形式Matlab就会知道,X是一个矢量。
testFct1 = inline('(X(1)-1)^2 + (X(2)-16)^2 + (X(3)+2)^4 + 5*norm(X(4)) + (X(5)+18)^2 + 10', 'X');
现在的问题是我的testFct6写成上面的那种形式太复杂,必须要简写
testFct6 = inline(' -1/sqrt((e_1)^3*det(R1)) ', 'X');其中e_1和R1都可以有X向量中的元素X(1).....X(6)表示出来。我不知道应该如何表示,因为我之前是用符号变量定义了X1....X6的,而inline的自变量是数值变量,我不知道是不是可以进行两者之间的转换
或者用m函数也可以实现这样的功能?
发表于 2007-11-18 11:06 | 显示全部楼层

回复 #5 cherryliu 的帖子

%那就全用字符来代换啊,例如定义x+y-sin(x)/tan(log10(x));
fstr='-sin(x)/tan(log10(x))';
fh=inline(['x+y',fstr],'x','y');
fh(10,0)
%或者多建几个inline函数,然后相加,比如:fh1=inline('x');fh2=inline('x');fh1(x)+fh2(x^2)不就相当于x+x^2了吗?

[ 本帖最后由 donkeyxu 于 2007-11-18 11:14 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-9-23 21:25 , Processed in 0.055943 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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