python傅里叶变换,模拟光孤子脉冲传输

读研究生的时候,孤子的数值模拟都是MATLAB完成的,说实话我根本不会MATLAB,都是导师教我基本的程序思路,固定模式编写,然后调参数,出数据。现在自己学会了Python,一直想做Python版本的代码出来。参考了不少人的博客,傅里叶变换更是似懂非懂,模模糊糊。代码是参考别人的博客,改出来的。改了一年多,今天忽然出来一个图片,我猜应该是思路对了,懂的朋友,给我指点一下,看看哪里还有问题。
参考 文章:https://blog.csdn.net/ChouMaRenShen/article/details/97979782

下面是我的代码

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from scipy.fftpack import fft,ifft
import numpy.fft as nf
T = 50
#时间窗口
tn = 2 ** 10
# 时间区域个数(2 ^ M个)
dt = T/tn
#选择的时间步长  np.linspace(2,10,num=5,endpoint=False)
t = (np.linspace(1, tn)- (tn+1)/2)*dt
w = nf.fftfreq(T, tn)
#傅里叶域频率, 调用计算频率函数

b = 0.03
c = (-1j*w**2)/2+1j*b*w** 3
dz =0.1
fig=plt.figure()
ax=Axes3D(fig)
#t=np.arange(-2,2,0.1)
t2=np.arange(-1,1,0.05)
print(t)
y=np.arange(0,100,0.1)
print(y)
#生成网格点坐标矩阵。
t,y=np.meshgrid(t,y)
print(t)
print(y)
#for i in range(20):
z=np.cosh(t)/np.sinh(t)*0.48*np.exp(-1j*np.sin(10*t))#亮孤子脉冲
#z=np.tanh(t)#暗孤子 孤子脉冲
for k  in range(0,900):
    print(k)   #分布傅里叶变换解方程  np.vstack([a, new_row])
    z1=fft(np.exp(c*dz/2)*ifft(z[k,:]))
    z2=z1*np.exp(1j*dz*abs(z[k,:])**2)
    z[k+1,:]=fft(np.exp(c*dz/2)*ifft(z2))
    #print(z[k+1,:])
    for m in range(2):
        z2=z1*np.exp(1j*dz/2*(abs(z[k,:])**2+abs(z[k+1,:])**2))
        z[k+1,:]=fft(np.exp(c*dz/2)*ifft(z2))
#绘制3D曲面
print(np.shape(z))
print(z)
ax.plot_surface(t,y,abs(z),rstride=10,cstride=5,cmap='rainbow')
# rstride(row)指定行的跨度  # cstride(column)指定列的跨度
#ax.view_init(elev=300,azim=300)
plt.show()

输入亮孤子脉冲,最后的仿真结果看下图:
python傅里叶变换,模拟光孤子脉冲传输_第1张图片
python傅里叶变换,模拟光孤子脉冲传输_第2张图片
下面是暗孤子输入后的结果,脉冲轮廓有奇怪的跳变:
python傅里叶变换,模拟光孤子脉冲传输_第3张图片
python傅里叶变换,模拟光孤子脉冲传输_第4张图片
下面是参考文献作者的原图
python傅里叶变换,模拟光孤子脉冲传输_第5张图片
至少现在模仿别人的,有了一点点进步,下一步继续研究代码,修改错误,逐步把孤子用Python仿真出来,有机会的时候,在做做科研。懂的大佬请给我多多指点,评论区留言给我,不胜感激。

你可能感兴趣的:(光孤子,python,numpy,光通信)