我是Matlab编程的新手。我试图找出如何计算以下函数:
我知道我的代码已关闭,我只是想从某种形式的函数开始。我试图在下面的程序中写出函数的总和。
function [g] = square_wave(n)
g = symsum(((sin((2k-1)*t))/(2k-1)), 1,n);
end
非常感谢任何帮助。
更新
截至目前我的代码:
function [yout] = square_wave(n)
syms n;
f = n^4;
df = diff(f);
syms t k;
f = 1; %//Define frequency here
funcSum = (sin(2*pi*(2*k - 1)*f*t) / (2*k - 1));
funcOut = symsum(func, v, start, finish);
xsquare = (4/pi) * symsum(funcSum, k, 1, Inf);
tVector = 0 : 0.01 : 4*pi; %// Choose a step size of 0.01
yout = subs(xsquare, t, tVector);
end
答案 0 :(得分:3)
注意:这个答案部分受到我在此写的帖子的启发:How to have square wave in Matlab symbolic equation - 但是,它并不完全相同,这就是我提供答案的原因这里。
好吧,所以看起来你问的第一点是正确的。但是,当您将事物相乘时,您需要使用*
运算符...因此2k - 1
应为2*k - 1
。忽略这一点,给出方波方程,你symsum
正确。此函数的输入仅为一个参数 - n
。您在上面的等式中看到的是方波的Fourier Series表示。这个理论的一个卑鄙版本是你可以将周期函数表示为正弦函数的无限求和,每个函数加权一定量。你在等式中看到的实际上是方波的傅里叶级数。
n
控制要添加到等式中的正弦曲线的总数。你拥有的正弦波越多,功能看起来就越像方波。在问题中,他们希望您使用n
的值。如果n
变得非常大,它应该开始接近看起来像方波的东西。
symsum
将此傅立叶级数表示为t
的函数。您现在需要做的是,您需要将t
的值替换为此表达式,以获取每个值t
的输出幅度。他们已经为您定义了从0
到4*pi
的向量,其间有1001个点。
定义此向量,然后您需要使用subs
将时间值替换为symsum
表达式,完成后,将它们转回double
,以便你实际上得到了一个数字向量。
因此,您的功能应该是这样:
function [g] = square_wave(n)
syms t k; %// Define t and k
f = sin((2*k-1)*t)/(2*k-1); %// Define function
F = symsum(f, k, 1, n); %// Define Fourier Series
tVector = linspace(0, 4*pi, 1001); %// Define time points
g = double(subs(F, t, tVector)); %// Get numeric output
end
第一行定义t
和k
是符号,因为t
和k
在表达式中是符号。接下来,我将f
定义为与t
和k
相关的总和中的术语。之后的行定义了实际的总和本身。我们使用f
并对k
求和,因为这就是求和要求的总和,从1到n
求和。最后但并非最不重要的是,我们定义了从0
到4*pi
的时间向量,中间有1001个点,我们使用subs
替换傅里叶级数中t
的值此向量中的所有值。结果应该是1001向量,然后我将其转换为double
以获得数值结果,我们得到您想要的输出。
为了向您显示此功能,我们可以使用n = 20
进行尝试。现在在命令提示符下执行此操作:
>> g = square_wave(20);
>> t = linspace(0, 4*pi, 1001);
>> plot(t, g);
我们得到:
因此,如果你让n
走得更高......如他们所暗示的那样200,你会看到波浪最终看起来像你对方波所期望的那样。
如果您没有symsum
,syms
和subs
依赖的符号数学工具箱,我们可以完全用数字方式完成。您需要做的是为t
和n
对定义meshgrid
个点,将每个对替换为傅里叶级数的序列方程,并总结所有结果
因此,你会做这样的事情:
function [g] = square_wave(n)
tVector = linspace(0, 4*pi, 1001); %// Define time points
[t,k] = meshgrid(tVector, 1:n); %// Define meshgrid
f = sin((2*k-1).*t)./(2*k-1); %// Define Fourier Series
g = sum(f, 1); %// Sum up for each time point
end
第一行代码定义了从0
到4*pi
的时间点。下一行代码定义了meshgrid
个点。这是如何工作的,对于t
,每列定义一个唯一的时间点,因此第一列是200个零,直到最后一列,即200 4*pi
个值的列。同样,对于k
,每个行表示唯一的n
值,因此第一行为1001 1s,后跟1001 2s,最多为1001 1s。现在的含义是,t
和k
的每一列都表示正确的(t,n)
对,用于计算每列对该列唯一的傅里叶级数的输出。
因此,您只需使用序列方程并执行元素方式乘法和除法,然后沿每个单独的列求和以最终得到方波输出。使用上面的代码,你将得到与上面相同的结果,并且它将比symsum
快得多,因为我们现在正在以数字方式进行,而不是象征性地进行,这会产生更多的计算开销。
以下是n = 200
:
此代码n=200
以毫秒为单位,而symsum
相当于我的机器上花了近2分钟 - Mac OS X 10.10.3 Yosemite,16 GB RAM,Intel Core i7 2.3 GHz。