Matlab的方波函数

时间:2015-05-23 19:33:29

标签: matlab function

我是Matlab编程的新手。我试图找出如何计算以下函数:

enter image description here

我知道我的代码已关闭,我只是想从某种形式的函数开始。我试图在下面的程序中写出函数的总和。

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

1 个答案:

答案 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的输出幅度。他们已经为您定义了从04*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

第一行定义tk是符号,因为tk在表达式中是符号。接下来,我将f定义为与tk相关的总和中的术语。之后的行定义了实际的总和本身。我们使用f并对k求和,因为这就是求和要求的总和,从1到n求和。最后但并非最不重要的是,我们定义了从04*pi的时间向量,中间有1001个点,我们使用subs替换傅里叶级数中t的值此向量中的所有值。结果应该是1001向量,然后我将其转换为double以获得数值结果,我们得到您想要的输出。

为了向您显示此功能,我们可以使用n = 20进行尝试。现在在命令提示符下执行此操作:

>> g = square_wave(20);
>> t = linspace(0, 4*pi, 1001);
>> plot(t, g);

我们得到:

enter image description here

因此,如果你让n走得更高......如他们所暗示的那样200,你会看到波浪最终看起来像你对方波所期望的那样。

如果您没有symsumsymssubs依赖的符号数学工具箱,我们可以完全用数字方式完成。您需要做的是为tn对定义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

第一行代码定义了从04*pi的时间点。下一行代码定义了meshgrid个点。这是如何工作的,对于t,每列定义一个唯一的时间点,因此第一列是200个零,直到最后一列,即200 4*pi个值的列。同样,对于k,每个表示唯一的n值,因此第一行为1001 1s,后跟1001 2s,最多为1001 1s。现在的含义是,tk的每一列都表示正确的(t,n)对,用于计算每列对该列唯一的傅里叶级数的输出。

因此,您只需使用序列方程并执行元素方式乘法和除法,然后沿每个单独的列求和以最终得到方波输出。使用上面的代码,你将得到与上面相同的结果,并且它将比symsum快得多,因为我们现在正在以数字方式进行,而不是象征性地进行,这会产生更多的计算开销。

以下是n = 200

时的结果

enter image description here

此代码n=200以毫秒为单位,而symsum相当于我的机器上花了近2分钟 - Mac OS X 10.10.3 Yosemite,16 GB RAM,Intel Core i7 2.3 GHz。