在符号表达式中使用变量-matlab

在符号表达式中使用变量-matlab,matlab,symbolic-math,Matlab,Symbolic Math,如何在Matlab中使用符号变量中的变量 例如,我有以下代码: function f = constr_fourier(vec); dim=prod(size(vec)); n=(dim-1)/2; a=@(k) vec(k+1); b=@(k) vec(n+k-1); f = @(x) subs(a,{k,0})/2 + symsum(subs(a,{k,i})*cos(i*x) + ... subs(b,{k,i})*sin(i*x),i,1,n); 其中,我想恢复给定系数向量的傅里叶级

如何在Matlab中使用符号变量中的变量

例如,我有以下代码:

function f = constr_fourier(vec);
dim=prod(size(vec));
n=(dim-1)/2;
a=@(k) vec(k+1);
b=@(k) vec(n+k-1);

f = @(x) subs(a,{k,0})/2 + symsum(subs(a,{k,i})*cos(i*x) + ...
subs(b,{k,i})*sin(i*x),i,1,n);
其中,我想恢复给定系数向量的傅里叶级数
vec
。我想将vec中的实际值替换为函数的符号表达式。我用
subs
试过,但没用,或者我没用对

正确的方法是什么

[编辑]我试过了

f = @(x) subs(a,k,0)/2 + symsum(subs(a,k,i)*cos(i*x) + ...
subs(b,{k,i})*sin(i*x),i,1,n);
但是结果是使用
subs(…)
,而不是使用
a(k)
的数值

我也尝试了一个不同的变体,它给出了一个结果,但以错误的方式

function f = constr_fourier(w);
syms x k n u c t vector;

evalin(symengine,'assume(k,Type::Integer)');

dim=prod(size(w));
m=(dim-1)/2;

a0=w(1);
a= w(2:m+1);
b= w(m+2:2*m+1);

u=@(k,vector) vector(k);

fs = @(x,n,c) c/2 + symsum(subs(u,{k,vector},{t,a})*cos(t*x) + subs(u,{k,vector},          {t,b})*sin(t*x),t,1,n);

f= fs(x,m,a0);
我尝试使用函数
u=@(k,vec)vec(k)
而不是最初的函数。当我在终端中分别使用
subs(u,{k,vector},{t,a})
时,它工作正常,但在这里它不

我得到的结果是两个函数的向量,而不是一个函数。

确实是正确的方法,你只是用错了

subs
有三个输入参数:符号表达式、要替换的参数及其新值。但是有一个例外:如果有两个输入参数,
subs
将表达式中的默认符号参数替换为第二个参数

无论如何,您似乎缺少了
subs
中的新值,因此它的行为与您的意图不符。我想应该是这样的:

subs(a, k, 0)
等等

作为旁注,只使用
subs
一次就足够了(而且更优雅)。计算整个符号表达式,然后使用
subs
一次。因此,不是:

subs(a, ...) + subs(b, ...)
我建议您改为这样做:

subs(a + b, ...)
这确实是正确的方法,你只是用错了

subs
有三个输入参数:符号表达式、要替换的参数及其新值。但是有一个例外:如果有两个输入参数,
subs
将表达式中的默认符号参数替换为第二个参数

无论如何,您似乎缺少了
subs
中的新值,因此它的行为与您的意图不符。我想应该是这样的:

subs(a, k, 0)
等等

作为旁注,只使用
subs
一次就足够了(而且更优雅)。计算整个符号表达式,然后使用
subs
一次。因此,不是:

subs(a, ...) + subs(b, ...)
我建议您改为这样做:

subs(a + b, ...)
如果你定义

a=@(k) vec(k+1);
然后
a
不是一个符号表达式,而是一个函数,要在其中获得
k
的特定值,不能使用
subs
。相反,您必须调用函数
a

a(1)

f = @(x) a(0)/2 + sum(@(i) a(i)*cos(i*x) + b(i)*sin(i*x),1,n)
如果你定义

a=@(k) vec(k+1);
然后
a
不是一个符号表达式,而是一个函数,要在其中获得
k
的特定值,不能使用
subs
。相反,您必须调用函数
a

a(1)

f = @(x) a(0)/2 + sum(@(i) a(i)*cos(i*x) + b(i)*sin(i*x),1,n)

这仍然不起作用。结果以符号形式给出,其中仍有
subs
。变量并没有被它们的数值所取代…@BeniBogosel如果你在你的问题中发布你已经尝试过的东西会有所帮助,这样我就可以看到错误的地方。我放弃了这种方法。。。潜艇一直在做一个2x1的矢量结果,我不明白。单独运行时一切正常,但symsum不起作用。我做了一个sin(kx)的向量,一个cos(kx)的向量,并用两个标量积求解它。谢谢你的帮助。:)@BeniBogosel您的问题是
symsum
还返回一个符号表达式。您应该先计算
a+b+symsum(…)
,然后只使用
subs
一次。无论如何,我也不喜欢符号数学——它肯定不是求解方程的最有效方法,所以没问题。这仍然不起作用。结果以符号形式给出,其中仍有
subs
。变量并没有被它们的数值所取代…@BeniBogosel如果你在你的问题中发布你已经尝试过的东西会有所帮助,这样我就可以看到错误的地方。我放弃了这种方法。。。潜艇一直在做一个2x1的矢量结果,我不明白。单独运行时一切正常,但symsum不起作用。我做了一个sin(kx)的向量,一个cos(kx)的向量,并用两个标量积求解它。谢谢你的帮助。:)@BeniBogosel您的问题是
symsum
还返回一个符号表达式。您应该先计算
a+b+symsum(…)
,然后只使用
subs
一次。无论如何,我也不喜欢符号数学——它肯定不是求解方程的最有效方法,所以没问题。