Matlab中符号函数的元素评价

时间:2014-06-15 17:23:01

标签: matlab symbolic-math

我有一个符号表达式向量和一个点向量。然后我想获得一个向量,其中第一个元素是第一个点评估的第一个符号函数,第二个 - 第二个函数在第二个点等等。我可以用'for'循环这样做

>> syms x
>> f=formula([x, x^2, x^3]);
>> a=[1, 2, 3];
>> ans=zeros(1,3);
>> for i=1:3
z(x)=f(i);
ans(i)=z(a(i));
end
>> ans
ans =
     1     4    27

但有没有办法避免循环?某种元素评估?

提前致谢!

2 个答案:

答案 0 :(得分:0)

首先,让我们避免使用符号数学工具箱。这是不必要的。尝试制作formula接受矢量化输入。如果我理解了您的问题,一般情况下您希望采用矩阵,第一列适用x,第二列适用x^2,第三列适用{{} 1}}。换句话说,这样做:

x^3

这称为anonymous function。简单地说,它将返回存储在f = @(x) [x(:,1), x(:,2).^2, x(:,3).^3]; 中的函数,该函数将执行我们上面刚才描述的操作。这个函数将做的是它将采用矩阵的第一列,并输出f。矩阵的第二列将输出这些值但平方,矩阵的最后一列将输出这些值但是立方。现在,提供一个矩阵,其中每个对应于您要为x中的每个元素评估的值。

示例:

f

现在,只需使用A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 作为A的输入。

f

第一行评估result = f(A) result = 1 4 27 4 25 216 7 64 729 处的公式,下一行评估您的公式[1,2,3],依此类推。

您的示例仅为一行提供此内容,但此处的代码推广为[4,5,6]矩阵。

注意

这仅适用于矩阵有3列的情况。如果你尝试做更多的事情,你会得到一个索引越界错误...这是有道理的,因为你的公式一次只定义了三个输入。

答案 1 :(得分:0)

这是对您的问题的补充答案,假设我们必须使用符号数学工具箱。首先,正常创建公式:

syms x
f = formula([x, x^2, x^3);

然后,您可以使用subsx的值替换为您想要的值。 subs的语法如下:

out = subs(f, val);

val可以是您希望替换公式中的变量的值的单个值,向量或矩阵。如果要使用矢量,请将其指定为列矢量,这一点非常重要。你以后会明白为什么。

这背后的关键是,对于要用于替换的x的每个值,它将用x替换整个公式。换句话说,如果您执行out = subs(f, [1;2;3]);,则会输出一个矩阵,其中第一行包含x=1,下一行包含x=2,最后一行包含x=3 }。如果您执行了out = subs(f,[1 2 3]);,则会为您提供9 x 1向量,其中三个中的每个三个都是该特定x值的输出。

这并不是您想要的,但是当您将输入指定为列向量作为输出时,您可以简单地选择沿对角线的所有元素,因为这样将向量中元素的i'th条目与i'th公式对应。

换句话说:

A = (1:3).';
out = subs(f, A)

out =

[ 1, 1,  1]
[ 2, 4,  8]
[ 3, 9, 27]

finalOut = diag(out)

finalOut =

  1
  4
 27

这是我在不使用for循环的情况下看到这一点的唯一方法。请记住,这仅适用于单个矢量。如果您想要实际的double值,而不是将其表示为sym,则您需要使用double()转换输出。