Matlab-定义一个通用变量

Matlab-定义一个通用变量,matlab,Matlab,我想计算一些函数的傅里叶级数func 我构建这个方法: function y = CalcFourier(accurate, func, a, b, val_x) f = @(x) eval(func); % calculate coefficients a0 = (2 / (b - a)) * calcArea(func, a , b); an = (2 / (b - a)) * calcArea(strcat(func, '*cos(2*n*pi*x / (

我想计算一些函数的傅里叶级数
func

我构建这个方法:

function y = CalcFourier(accurate, func, a, b, val_x) 
    f = @(x) eval(func);
    % calculate coefficients
    a0 = (2 / (b - a)) * calcArea(func, a , b);
    an = (2 / (b - a)) * calcArea(strcat(func, '*cos(2*n*pi*x / (b - a))'), a , b);
    an = (2 / (b - a)) * calcArea(strcat(func, '*sin(2*n*pi*x / (b - a))'), a , b);
    partial = 0;
    an_f = @(n) an;
    bn_f = @(n) bn;
    for n = 1:accurate
        partial = partial + an_f(n)* cos(2*n*pi*val_x / (b - a)) + bn_f(n) * sin(2*n*pi*val_x / (b - a));
    end

    y = (a0 / 2) + partial;
end
这个-为了近似系数:

function area = calcArea(func, a, b)
    f = @(x) eval(func);
    area = (a - b) * (f(a) - f(b)) / 2;
end
在线
an=(2/(b-a))*calcara(strcat(func),*cos(2*n*pi*x/(b-a))),a,b)我收到错误信息:

??? Error using ==> eval
Undefined function or variable 'n'.

Error in ==> calcArea>@(x)eval(func) at 2
    f = @(x) eval(func);

Error in ==> calcArea at 3
    area = (a - b) * (f(a) - f(b)) / 2;

Error in ==> CalcFourier at 5
    an = (2 / (b - a)) * calcArea(strcat(func,
    '*cos(2*n*pi*x / (b - a))'), a , b);

>> 

是否有将
n
声明为“某个常量”的选项?谢谢

您尝试在代码的第4行中使用名为
n
的变量。但是当时还没有定义
n
,这只发生在for循环中。(提示:如果出现错误,请始终使用
dbstop,这样您可以更容易地发现问题)

虽然我不能完全理解你在做什么,但我相信你需要这样的东西:

n=1
在CalcFourier函数的开头。当然,您也可以选择输入n作为变量,或者将相应的行移动到实际定义了
n
的位置

此外,您似乎在
calcArea
中使用了
n
,但根本不尝试将其传递给函数



如果您避免使用
eval
,所有这些都会更容易找到,也许您可以尝试在不使用它的情况下创建函数,然后matlab将更容易地指导您解决代码中的问题。

如果符号工具箱可用,则可以使用它声明符号变量,可以将其视为“某个变量”,并在以后用值替换

但是,为了实现它,应该做一些更改,通常将匿名函数转换为符号函数,将n的任何函数转换为符号函数。最后,生成的答案将需要从符号值转换为更易于处理的值,例如double

如下所示,快速将其实现到您的代码中

function y = test(accurate, func, a, b, val_x)
syms n x % declare symbolic variables
%f = symfun(eval(func),x); commented out as not used
上面的两行显示了符号变量的声明和创建符号函数的语法

% calculate coefficients
a0 = symfun((2 / (b - a)) * calcArea(func, a , b),x);
an = symfun((2 / (b - a)) * calcArea(strcat(func, '*cos(2*n*pi*x / (b - a))'),...
... a , b),[x n]);
bn = symfun((2 / (b - a)) * calcArea(strcat(func, '*sin(2*n*pi*x / (b - a))'),...
... a , b),[x n]);
partial = 0;
代码中的函数定义被合并到上面的行中,注意它们的函数是x和n,x_val的替换将在后面完成

for n = 1:accurate
    partial = partial + an(val_x,n)* cos(2*n*pi*val_x / (b - a)) +...
    ... bn(val_x,n) * sin(2*n*pi*val_x / (b - a));
end
for循环现在用值替换符号n,并用x_val和每个n值调用符号函数

y = (a0 / 2) + partial;
y = double(y);
end
最后计算出该解,并将其转换为双精度解


免责声明:我没有检查此代码是否生成正确的解决方案,但我希望它能提供足够的信息,让您了解发生了哪些更改,以及为什么要执行上述代码中给出的过程,使用符号工具箱解决此问题…

matlab中没有常量。您可以像这样声明n。