如何在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})
时,它可以正常工作,但这里没有......
我将结果作为两个函数的向量而不是函数。
答案 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)