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

时间:2012-12-05 14:50:02

标签: 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);

我想在给定系数vec的向量的情况下恢复傅立叶级数。我想将vec中的实际值替换为函数的符号表达式。我尝试使用subs,但它不起作用,或者我没有正确使用它。

这样做的正确方法是什么?

[edit]我试过了

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})时,它可以正常工作,但这里没有......

我将结果作为两个函数的向量而不是函数。

2 个答案:

答案 0 :(得分:3)

subs确实是正确的方法,你只是错误地使用它。

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

无论如何,您似乎错过了subs中的新值,因此它的行为与您的意思不同。我认为应该看起来像这样:

subs(a, k, 0)

等...

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

subs(a, ...) + subs(b, ...)

我建议你这样做:

subs(a + b, ...)

答案 1 :(得分:0)

如果你定义

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)