如何在Matlab符号方程中得到方波

时间:2014-06-02 21:25:01

标签: matlab symbolic-math

我的项目要求我使用Matlab创建一个内部有方波的符号方程。 我试着这样写,但无济于事:

syms t;
a=square(t);
  
    

输入参数必须为“double”。

  

我该怎么做才能解决这个问题?提前感谢您提供的帮助。

3 个答案:

答案 0 :(得分:4)

以下是使用floorsign函数的几个常规选项:

f=@(A,T,x0,x) A*sign(sin((2*pi*(x-x0))/T));
f=@(A,T,x0,x) A*(-1).^(floor(2*(x-x0)/T));

例如,使用floor函数:

 syms x
 sqr=2*floor(x)-floor(2*x)+1;
 ezplot(sqr, [-2, 2])

enter image description here

答案 1 :(得分:4)

这是让你入门的东西。回想一下,我们可以将方波表示为Fourier Series expansion。我不会打扰你的细节,但你可以将任何周期性函数表示为余弦和正弦的总和(àla@RTL)。在不进行推导的情况下,这是频率为f的方波的闭合方程,其峰 - 峰幅度为2(即,它从-1变为1)。回想一下,频率是每秒周期的数量。因此,f = 1意味着我们每秒重复一次方波。

Fourier

基本上,你要做的就是编写方程式的第一行......但你会怎么做呢?欢迎来到符号数学工具箱的世界。我们需要做的事情就是声明我们的频率。我们现在假设f = 1。使用符号数学工具箱,您可以在MATLAB中定义被视为数学变量的内容。之后,MATLAB有一整套工具可用于评估依赖这些变量的函数。一个很好的例子是,如果您想使用它来定义函数f(x)封闭形式解决方案。然后,您可以使用diff来区分并查看衍生产品。亲自尝试一下:

syms x;
f = x^4;
df = diff(f);

syms表示您在声明之后声明任何数学变量。在这种情况下,x就是这样。 df现在应该给你4x^3。很酷吗?无论如何,让我们回到手头的问题。我们发现在周期平方函数中实际上有两个变量需要定义:tk。一旦我们这样做,我们需要创建首先在求和中的函数。我们可以通过以下方式实现:

syms t k;
f = 1; %//Define frequency here
funcSum = (sin(2*pi*(2*k - 1)*f*t) / (2*k - 1));

这解决了这个问题......现在我们如何将其封装成无限的总和!? MATLAB中的sum命令假定我们有一个有限数组来求和。如果要象征性地对函数求和,我们必须使用symsum函数。我们通常称之为:

funcOut = symsum(func, v, start, finish);

func是我们希望总结的功能。 v是我们希望用于在总和中索引的求和变量。在我们的例子中,那是kstart是总和的开头,在我们的情况下为1,finish是我们希望完成总和的地方。在我们的例子中,那是无穷大,因此MATLAB有一个特殊的关键字Inf来表示。因此:

xsquare = (4/pi) * symsum(funcSum, k, 1, Inf);

xquare现在包含您根据符号数学工具箱定义的方波表示。现在,如果你想绘制方波,看看我们是否正确。我们可以做到以下几点。我们来看-3 <= t <= 3。因此,你会做这样的事情:

tVector = -3 : 0.01 : 3; %// Choose a step size of 0.01
yout = subs(xsquare, t, tVector);

您会注意到会有一些NaN的值。之所以是因为正好处于周期的倍数(T = 1,2,3,...),行为是未定义的,因为这些点的导数权是未定义的。因此,我们可以使用1-1填写此内容。我们现在就选择1。此外,由于傅里叶级数通常是复值函数,而方波是纯粹的,因此该函数的输出实际上会给出一个复值向量。因此,只需切掉复杂的零件即可获得真正的零件:

yout = real(double(yout)); %// To cast back to double.
yout(isnan(yout)) = 1;
plot(tVector, yout);

你会得到类似的东西:

Square Wave

您也可以ezplot方式执行此操作:ezplot(xsquare)。但是,您会看到在波重复的点处,我们得到NaN值,因此高峰和低峰之间存在脱节。

注意:

纳坦的解决方案更加优雅。当他把东西拿出来的时候我还在写这篇文章。无论哪种方式,我都希望为如何做到这一点提供更多的信号处理视角。去傅里叶!

答案 2 :(得分:-1)

单位幅度方波的傅立叶级数为:

alpha + 2/Pi*sum(sin( n * Pi*alpha)/n*cos(n*theta),n=1..infinity)

这是一个方便的技巧:

 cos(n*theta) = Re( exp( I * n * theta)) 

1/n*exp(I*n*theta) = I*anti-derivative(exp(I*n*theta),theta)

将它们放在一起:将反导数(或积分)算子拉出总和,得到几何系列。然后整合并最终采取真实的部分。

结果:

squarewave= 
alpha+ 1/Pi*Re(I*ln((1-exp(I*(theta+Pi*alpha)))/(1-exp(I*(theta-Pi*alpha)))))

我在MAPLE中尝试过,效果很好! (虽然可能不太实用)