当前位置:   article > 正文

MATLAB编写m函数理解 y=f(g(x))*h(x)_x(k)在matlab中代表什么

x(k)在matlab中代表什么

目录

任务:

注:

1.任何字母本质上自变量都是k

2.除了笨方法,可能可以用特别的技巧:

2.1 简单函数作用矩阵=矩阵,代替for循环

2.2 矩阵点乘 替代 函数相乘

2.3 矩阵相乘 替代 求和符号

3.例题:DTFT *Ts

4. 总结


任务:

        将数学形式:y=f(g(x)),编写为MATLAB m函数。

注:

1.任何字母本质上自变量都是k

       MATLAB中,任何字母本质上自变量都是k,k表示第k个数。即任何函数再复杂,再复合,都可以for循环笨方法一个一个算出来。

y=[y(k)]=[f(g( x(k) ))],y,x,[]表示矩阵,y(k),x(k)表示一个数。

则MATLAB里,

k=1:K

x=[x(k)]=x1:xs:x2

y(k)=f(g(x(k)))

+for 循环

end

        但下标自变量k只能从1开始,不能从0。但字母值可以从零开始,如n=0:10;

2.除了笨方法,可能可以用特别的技巧:

2.1 简单函数作用矩阵=矩阵,代替for循环

若数学形式:y=f(x),f都是简单的函数,比如exp,sin等,则MATLAB里可:

y=f(x) % y,x均为矩阵

不用

for k..

y(k)=f(x(k))

end

2.2 矩阵点乘 替代 函数相乘

若数学形式:y=f(x)g(x),f,g都是简单的函数,比如exp,sin等,则MATLAB里或许可以省去for循环,通过:

y=f(x) .* g(x)      % y,x均为矩阵。

2.3 矩阵相乘 替代 求和符号

若数学形式:y=\sum_{k=1}^{N}f(x(k)))\cdot g((x(k))),则MATLAB里或许可以矩阵相乘 替代 求和符号,通过:

f=[f(k)]=[f(x(k))]

g=[g(k)]=[g(x(k))]

y=f * g',f和g是k所控制的最高层变量。

3.例题:DTFT *Ts

求离散时间傅里叶变换 X(exp(jw))* Ts

 

编程出: X(e^{j\Omega T_{s}})=\sum_{n=0}^{N-1}x(n)e^{-j\Omega T_{s}n} \cdot T_{s}

解: 

1. X自变量看似exp(j*omega*T),很复杂,但其实是X=[X(k)]。

采用逻辑自底层而上。

写成好看的形式:

Ω(k)=Ω1:Δ:Ω2

x=[x(k)]=ejΩTsn(k)cos(w0Tn(k)))

 X(k)=n=0N1x(n(k)))ejΩ(k)Tsn(k)Ts其实k'没必要标了,只要写到自变量(k),即

X(k)=n=0N1x([n])ejΩ(k)Ts[n]Ts,

2. exp,cos为简单函数,MATLAB里可以省去for,直接作用矩阵产生矩阵。

3. exp * cos 简单函数相乘,MATLAB里可以点乘 .* 。

x=[x(k)]=[ejΩTsn(k)cos(w0Tn(k)))]=ejΩTs[n].cos(w0T[n]))

4. 有求和符号,MATLAB可以通过矩阵相乘简化。

  X(k)=n=0N1x(n(k)))ejΩ(k)Tsn(k)Ts=TsejΩ(k)Ts[n][x]

代码:

  1. % 复合函数
  2. % 求DTFT*Ts
  3. clc;clear;close all;
  4. %% x
  5. % 参数
  6. fs=3; %采样频率
  7. f0=0.5;
  8. omega0=2*pi*f0;
  9. Ts=1/fs;
  10. T=100; %采样时间
  11. N=T*fs;
  12. %自变量
  13. n=0:N-1;
  14. zeta=0.05;
  15. x=exp(-zeta*Ts*[n]) .* cos(omega0*Ts*[n]);
  16. %% X
  17. omega=[0: 0.01: 4*pi] /Ts; %omega不必与[x(k)]数目相同,因为DTFD的w是连续的
  18. for k=1:length(omega)
  19. X(k)=Ts * exp(-1i*omega(k)*Ts*[n]) * [x]';
  20. end
  21. % 连续时间傅里叶变换 FT
  22. Y=1/2*(1./(zeta+1i*(omega- omega0))+1./(zeta+1i*(omega+omega0)));
  23. h=figure(1);
  24. set(h,'Position',[150,150,800,500])
  25. semilogy(omega/2/pi,abs(Y),'b','LineWidth',2)
  26. xlabel('\Omega/2 \pi =f','FontName','Times New /*不要回车换行*/ Roman','FontSize',14)
  27. ylabel('Amplitude','FontName','Times New /*不要回车换行*/ Roman','FontSize',14)
  28. grid on
  29. hold on
  30. semilogy(omega/2/pi,abs(X),'k','LineWidth',2)
  31. set(gca,'FontName','Times New Roman','FontSize',14)
  32. legend('True,FT',['DTFT*Ts,f_s=',num2str(fs)])

 仿真结果:

4. 总结

        MATLAB编程时,所有字母本质自变量都是k。

        for循环笨方法一定可以编出来。

        但有一些技巧可以不用那么麻烦:函数可以作用矩阵,矩阵点乘,矩阵相乘。

        这个DTFT*Ts编程例子很好,利用了所有的认知,包括X自变量其实是k,以及三个技巧。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/326385
推荐阅读
相关标签
  

闽ICP备14008679号