我想为某些函数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)) * calcArea(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
解释为“某些常数”?谢谢!
答案 0 :(得分:0)
您尝试在代码的第4行中使用名为n
的变量。但是当时n
尚未定义,只发生在for循环中。 (提示:始终使用dbstop if error
,这样您就可以更轻松地发现问题)。
虽然我不完全掌握你在做什么,但我相信你需要这样的东西:
在CalcFourier函数开始时 n=1
。当然,您也可以选择将n作为变量输入,或者将相应的行移动到实际定义n
的位置。
此外,您似乎在n
中使用calcArea
,但您根本不会尝试将其传递给函数。
如果您避免使用eval
,所有这些都会更容易找到,也许您可以尝试在没有它的情况下创建函数,然后matlab将更容易引导您解决代码中的问题。
答案 1 :(得分:0)
如果符号工具箱可用,它可用于声明符号变量,可以将其视为“某个变量”并稍后用值替换。
然而,应该对其进行一些改变,通常将匿名函数转换为符号函数,将n的任何函数转换为符号函数。最后产生的答案需要从符号值转换为更容易处理的值,例如双快速将此实现到您的代码中,如下所示;
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
最后计算出解决方案,然后转换为double;
免责声明:我没有检查此代码是否生成了正确的解决方案,但是我希望它能为您提供足够的信息来了解已更改的内容以及为什么要执行上面代码中给出的过程,使用符号工具箱来解决问题......