cherryliu 发表于 2007-11-17 18:11

matlab inline函数的一点疑问

我的原始代码如下:
a=;
a_dach=;
u0=2.5*10^-5;
D_1=;
syms X1 X2 X3 X4 X5 X6;
T=;
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=;
a_dach=;
u0=2.5*10^-5;
D_1=;
syms X1 X2 X3 X4 X5 X6;
T=;
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');
>>

在我电脑上完全正常,没有错误

cherryliu 发表于 2007-11-17 18:36

可能我没有把问题说清楚,这个testFct6将被赋值给主函数里面的一个变量
fitnessFct = testFct6;
而这个fitnessFct要求输入必须是一个6维的列向量,所以在调用这个函数的时候出错了。
不知道有没有什么办法修正一下

donkeyxu 发表于 2007-11-17 19:48

回复 #3 cherryliu 的帖子

%没有办法,看doc inline说明就知道了
%要说输入向量也是分别代入算,例如
fh=inline('x.^2');
fh(1:3)
%所以你只有定义6个参数.
%或者不用inline,用m函数

cherryliu 发表于 2007-11-17 20:13

原帖由 donkeyxu 于 2007-11-17 19:48 发表 http://www.chinavib.com/forum/images/common/back.gif
%没有办法,看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)这种表达形式很麻烦,所以我想先预定义一下,见我前面的代码。

cherryliu 发表于 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函数也可以实现这样的功能?

donkeyxu 发表于 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 编辑 ]
页: [1]
查看完整版本: matlab inline函数的一点疑问