数学王子高斯的手稿
高斯有一本手稿,讲数学的,这本手稿中有一个数学命题,给出了某条椭圆曲线上的有理点的个数的一个公式,没有证明。然后这个命题,和正特征的黎曼猜想有关,也跟Weil conjecture有关,启发了20世纪多位菲奖的工作。
高斯未发表某些数学思想的原因
客观原因
时间和精力的有限
高斯的天文学、大地测量学、物理学及与此有关的数学工作占去了他大部分时间,而且他这些方面的成果基本上都发表了。可以注意到,他未发表的工作都是纯数学方面的—纯数学在此指不是由别的学科或实际需要而产生的且当时对其它学科或实际尚无用途的数学。他从事这方面研究的时间很有限,这是造成他许多纯数学思想未发表的重要因素。
数学专门化时代的到来
对个人来说,既专又博已非常困难了,时间和精力往往不允许这样。譬如,经长期努力,高斯首先 有了非欧几何的思想,当他刚写了一小部分时,罗巴切夫斯基和鲍耶也有了非欧几何的思想,并早于高斯发表了。大约1811年,高斯发现了复变函数的个别重要定理,尚未满意地写出时,柯西也发现并发表了著作。高斯通过研究复数得到第一个交换代数,尚未进一步深入研究时,哈密顿发现了非交换代数—四元数,并用十几年时间发展它。高斯自己也曾说:“自然,我的女神,我对你的规律的贡献是有限的….”这在高斯的学生、多才的黎曼那里也有类似的情形,他的著作大约有三分之二生前未发表,很大程度上是因为自认为探讨不够造成的。
经济原因和其它外界因素
高斯的第一部重要著作《算术探讨》出版后,在德国也未引起什么反应。他在给很多朋友的信中都讨论了非欧几何,但无人感兴趣。至少在德国,外界对高斯的纯数学研究没起到激励、推动作用。只是由于对数学的爱好,他才进行纯数学研究。《算术探讨》的受冷落无疑影响了他写作的积极性。事实上,《算术探讨》不但受冷遇,在此之前的出版也不易。高斯先将其寄到法国,被退稿;在德国也难出版,后来只好自费出版了这部巨著。而当时高斯工作无着落,家境十分贫困。他在椭圆函数研究笔记中曾写到:“象这样的生活,活着还不如死了好”。
人类对数学发展的认识过程
作为一个探索者他不是先知,未必能意识到新的纯数学思想的重要,更难以意识到哪些更重要,所以他曾把一些重要的数学思想留给自己或保密一段时间,是有道理的。其实,一个数学思想的重要性是随着它的进一步发展、应用才逐步显示出来的.高斯发表了一些考虑比较成熟的纯数学成果,而另一些后来证明更重要的思想未发表,这是不应苛求的。柯西很重要的一篇论文以及黎曼创立黎曼几何的重要论文生前也没发表,这说明了同一个道理:一个新的重要思想,特别是没有实际背景的数学思想,有一个逐渐被人认识的过程,这也符合人类认识事物的规律。
主观原因
高斯不断探索的特点
高斯对未知领域有着强烈的好奇心,以致经常还未将已得到的思想系统地写出,就开始探索新领域了。
高斯的学术风格
高斯很注重数学推理的严密和作品的精练。他曾说:“我所说的证明用意与律师的不同,律师认为两个一半的证明等于整个证明;而我是按数学家的意义来理解的,即,半个证明是零,要寻求使任何疑问成为不可能的证明。
世界观及性格
高斯的世界观具有明显的时代特点,象他同时代德国一些先进思想家如哥德、黑格尔一 样,具有两面性:既有进步的追求真理的一面,又有落后的保守的一面。
学术咨询:
担任《Mechanical System and Signal Processing》《中国电机工程学报》等期刊审稿专家,擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测。
基于小波分析的时间序列降噪(Python,ipynb文件)
部分代码如下:
import os import numpy as np from pywt import cwt, wavedec, swt, WaveletPacket from scipy.fft import rfft, irfft, rfftfreq import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec plt.rcParams.update({"font.size": 12, "font.weight": 'bold', "lines.linewidth": 1.5}) #Load the data pds = np.loadtxt(r"Data\pds_sim.txt")[:832, :] pds30 = np.loadtxt(r"Data\pds_sim30.txt")[:832] # Calculate number of sampling pint, sampling frequency N, deltaT = len(pds[:, 0]), (pds[1, 0]-pds[0, 0]) # Take Fourier transform of the data fft_pds, fft_pds30 = rfft(pds[:, 1]), rfft(pds30) fq = rfftfreq(N, deltaT) # Take Short Time Fourier Transform of the data # stft_fq, stft_t, stft_esr = stft(x=-1*data_esr[:, 1], fs=deltaT, window='hann', nperseg=256, noverlap=0) # _, _, stft_esr30 = stft(x=data_esr30, fs=deltaT, window='hann', nperseg=256, noverlap=0) seg = [0, 208, 416, 624] stft_pds, stft_pds30 = np.empty((len(seg), len(fft_pds)), dtype=np.complex64), np.empty((len(seg), len(fft_pds)), dtype=np.complex64) for i in range(len(seg)): tempd1, tempd2 = np.zeros((N)), np.zeros((N)) tempd1[:208], tempd2[:208] = pds[seg[i]:seg[i]+208, 1], pds30[seg[i]:seg[i]+208] stft_pds[i, :], stft_pds30[i, :] = rfft(tempd1), rfft(tempd2) # Frequency filtering # Copy the data fftbp_pds, fftbp_pds30 = np.copy(fft_pds), np.copy(fft_pds30) fftgp_pds, fftgp_pds30 = np.copy(fft_pds), np.copy(fft_pds30) # Perform low and high frequency filtering #fftbp_esr[(freq_esr < np.max(freq_esr)/2)], fftbp_esr30[(freq_esr < np.max(freq_esr)/2)] = 0, 0 fftbp_pds30[(fq > (np.max(fq))/2)] = 0 # generate a Gaussian bandpass function gaussp = np.exp(-((fq - min(fq))/(2*16))**2) + np.exp(-((fq - max(fq))/(2*16))**2) # Possitive frequency #gaussn = np.exp(-((fq + min(fq))/(2*0.1))**2) + np.exp(-((fq + max(fq))/(2*0.1))**2) # Negative frequency gaussf = gaussp #+ gaussn # Only have possitive frequencies hence need to filter them only fftgp_pds30 = fftgp_pds30*gaussf # Reconstruct the data using inverse Fourier transform databp_pds, databp_pds30 = irfft(fftbp_pds), irfft(fftbp_pds30) datagp_pds, datagp_pds30 = irfft(fftgp_pds), irfft(fftgp_pds30) # Take FT of the denoised data ftbp_pds30, ftgp_pds30 = rfft(databp_pds30), rfft(datagp_pds30) # Tiime domain pds Plot and save the data plt.figure(figsize=(4.5, 3), dpi=100, layout='constrained') # plt.plot(pds[:, 0], pds30[::-1], '-k', label='Noisy') plt.plot(pds[:, 0], pds30, '-r', label='Noisy') plt.plot(pds[:, 0], pds[:, 1], '-b', label='Noise-free') plt.legend(frameon=False, fontsize=10, loc='upper right') plt.xlim([(pds[0, 0]), (pds[831, 0])]) plt.xlabel('Time ($\\mu s$)', fontsize=14, fontweight='bold'), plt.ylabel('Magnitude', fontsize=14, fontweight='bold') # plt.vlines(x=pds[207, 0], ymin=min(pds[:, 1])-0.01, ymax=max(pds[:, 1])+0.01, color='k', ls='--', lw=2) # plt.vlines(x=pds[415, 0], ymin=min(pds[:, 1])-0.01, ymax=max(pds[:, 1])+0.01, color='k', ls='--', lw=2) # plt.vlines(x=pds[623, 0], ymin=min(pds[:, 1])-0.01, ymax=max(pds[:, 1])+0.01, color='k', ls='--', lw=2) # plt.savefig('pds.png', dpi=400, bbox_inches='tight', pad_inches=0.02) plt.show()
# Fourier transform plot # Arrow properties arprop, alp = dict(facecolor='black', shrink=0.005, width=2.5, alpha=0.7), 0.7 plt.figure(figsize=(4.5, 3), dpi=100, layout='constrained') plt.plot(fq, abs(fftgp_pds30), '-r', label='Noisy') plt.plot(fq, abs(fftgp_pds), '-b', label='Noise-free') plt.legend(frameon=False, fontsize=10, loc='upper right') plt.xlim([fq[0], fq[len(fq)-1]]) plt.ylim([-0.1, 9]) plt.xlabel('Frequency ($MHz$)', fontsize=14, fontweight='bold') plt.ylabel('Magnitude', fontsize=14, fontweight='bold') plt.annotate('Signal \n Distortion', xy=(3.5, 6), xytext=(3.5, 8), xycoords='data', arrowprops=arprop, alpha=alp, ha='left', fontsize=10) plt.annotate('Unable to Remove all Noise', xy=(38, 3), xytext=(38, 6.0), xycoords='data', arrowprops=arprop, alpha=alp, ha='center', fontsize=10) #plt.savefig('ftpdsgp.png', dpi=400, bbox_inches='tight', pad_inches=0.02) plt.show()
# Short Time Fourier Transform plot # Arrow properties arprop, alp = dict(facecolor='black', shrink=0.005, width=2.5, alpha=0.7), 0.7 plt.figure(figsize=(4.5, 3), dpi=100, layout='constrained') plt.plot(fq, abs(stft_pds30[3, :]), '-r', label='Noisy') plt.plot(fq, abs(stft_pds[3, :]), '-b', label='Noise-free') plt.legend(frameon=False, fontsize=10, loc='upper right') plt.xlim([fq[0], fq[len(fq)-1]]) plt.ylim([-0.01, 0.35]) plt.xlabel('Frequency ($MHz$)', fontsize=14, fontweight='bold') plt.ylabel('Magnitude', fontsize=14, fontweight='bold') plt.annotate('Noise Only', xy=(5, 0.26), xytext=(5, 0.33), xycoords='data', arrowprops=arprop, alpha=alp, ha='left', fontsize=10) #plt.annotate('Noise Only', xy=(3.0, 1.5), xytext=(3.0, 2.5), xycoords='data', arrowprops=arprop, alpha=alp, ha='center', fontsize=10) #plt.savefig('stftpds4.png', dpi=400, bbox_inches='tight', pad_inches=0.02) plt.show()
# Continuous Wavelet transform of the data scale = np.arange(2, 45, 1) cwt_pds, cfq_pds = cwt(data=pds[:, 1], scales=scale, wavelet='gaus3') cwt_pds30, cfq_pds30 = cwt(data=pds30, scales=scale, wavelet='gaus3') plt.figure(figsize=(4, 3), dpi=100, layout='constrained') plt.contourf(pds[:416, 0], cfq_pds, abs(cwt_pds[:, :416])**0.5, cmap='hot') #plt.contourf(pds[:416, 0], cfq_pds30, abs(cwt_pds30[:, :416])**0.5, cmap='hot') plt.xlabel('Time ($\\mu s$)', fontsize=14, fontweight='bold') #plt.ylabel('Scale', fontsize=14, fontweight='bold') plt.ylabel('Frequency', fontsize=14, fontweight='bold') plt.show()
plt.figure(figsize=(4, 3), dpi=100, layout='constrained') #plt.contourf(pds[:416, 0], cfq_pds, abs(cwt_pds[:, :416])**0.5, cmap='hot') plt.contourf(pds[:416, 0], cfq_pds30, abs(cwt_pds30[:, :416])**0.5, cmap='hot') plt.xlabel('Time ($\\mu s$)', fontsize=14, fontweight='bold') #plt.ylabel('Scale', fontsize=14, fontweight='bold') plt.ylabel('Frequency', fontsize=14, fontweight='bold') plt.show()
# Statonary wavelet transform dl=4 cf_db6, cf30_db6 = swt(data=pds[:, 1], wavelet='db6', level=dl), swt(data=pds30, wavelet='db6', level=dl) cf_coif3, cf30_coif3 = swt(data=pds[:, 1], wavelet='coif3', level=dl), swt(data=pds30, wavelet='coif3', level=dl) cf_sym10, cf30_sym10 = swt(data=pds[:, 1], wavelet='sym10', level=dl), swt(data=pds30, wavelet='sym10', level=dl) cf_dmey, cf30_dmey = swt(data=pds[:, 1], wavelet='dmey', level=dl), swt(data=pds30, wavelet='dmey', level=dl) dt, dt30 = cf_db6, cf30_db6 fig = plt.figure(figsize=(15, 4), dpi=100, layout='constrained') gs = fig.add_gridspec(2, 4, hspace=0, wspace=0) ax = gs.subplots(sharex=False, sharey=False) for i in range(1, 5): ax[0, i-1].plot(dt30[-i][0], '-r', label='Noisy'), ax[0, i-1].set_xlim(0, 832), ax[0, i-1].legend(frameon=False, fontsize=10, loc='upper right') ax[0, i-1].plot(dt[-i][0], '-b', label='Noise-free'), ax[0, i-1].set_xlim(0, 832), ax[0, i-1].legend(frameon=False, fontsize=10, loc='upper right') ax[1, i-1].plot(dt30[-i][1], '-r', label='Noisy'), ax[1, i-1].set_xlim(0, 832), ax[1, i-1].legend(frameon=False, fontsize=10, loc='upper right') ax[1, i-1].plot(dt[-i][1], '-b', label='Noise-free'), ax[1, i-1].set_xlim(0, 832), ax[1, i-1].legend(frameon=False, fontsize=10, loc='upper right') plt.show()
# Save wavelet coefficients dt, dt30 = cf_coif3, cf30_coif3 for i in range(1, dl+1): plt.figure(figsize=(4.5, 3), dpi = 100 , layout= 'constrained' ) plt.plot(dt30[-i][1], '-r', label='Noisy') plt.plot(dt[-i][1], '-b', label='Noise-free') plt.legend(frameon=False, loc='upper right') plt.xlim([0, len(pds[:, 1])-1]) plt.xlabel('Index', fontsize=14, fontweight='bold') plt.ylabel('Magnitude', fontsize=14, fontweight='bold') plt.ylim([min(dt[-i][0]), max(dt[-i][0])]) #plt.xticks([]) #plt.yticks([]) # plt.savefig('pdsdet_{i}.png'.format(i=i), dpi=400, bbox_inches='tight', pad_inches=0.02) plt.show()
wp_db6, wp_coif3 = WaveletPacket(data=pds[:, 1], wavelet='db6', maxlevel=3), WaveletPacket(data=pds[:, 1], wavelet='coif3', maxlevel=3) wp30_db6, wp30_coif3 = WaveletPacket(data=pds30, wavelet='db6', maxlevel=3), WaveletPacket(data=pds30, wavelet='coif3', maxlevel=3) dt = wp30_coif3 fig = plt.figure(figsize=(17, 4), dpi=100, constrained_layout=True) gs = fig.add_gridspec(3, 8, hspace=0, wspace=0) ax1, ax2 = fig.add_subplot(gs[0, 0:4]), fig.add_subplot(gs[0, 4:]) ax3, ax4, ax5, ax6 = fig.add_subplot(gs[1, :2]), fig.add_subplot(gs[1, 2:4]),fig.add_subplot(gs[1, 4:6]), fig.add_subplot(gs[1, 6:]) for i in range(7, 15): exec(f'ax{i} = fig.add_subplot(gs[2, i-7])') # ax7, ax8, ax9, ax10 = fig.add_subplot(gs[2, 0]), fig.add_subplot(gs[2, 1]),fig.add_subplot(gs[2, 2]), fig.add_subplot(gs[2, 3]) # ax11, ax12, ax13, ax14 = fig.add_subplot(gs[2, 4]), fig.add_subplot(gs[2, 5]),fig.add_subplot(gs[2, 6]), fig.add_subplot(gs[2, 7]) ax1.plot(dt['a'].data, '-b'), ax2.plot(dt['d'].data, '-r') ax3.plot(dt['aa'].data, '-b'), ax4.plot(dt['ad'].data, '-r'), ax5.plot(dt['da'].data, '-b'), ax6.plot(dt['dd'].data, '-r') ax7.plot(dt['aaa'].data, '-b'), ax8.plot(dt['aad'].data, '-r'), ax9.plot(dt['ada'].data, '-b'), ax10.plot(dt['add'].data, '-r') ax11.plot(dt['daa'].data, '-b'), ax12.plot(dt['dad'].data, '-r'), ax13.plot(dt['dda'].data, '-b'), ax14.plot(dt['ddd'].data, '-r') for i in range(1, 15): exec(f'ax{i}.set_xticks([])') exec(f'ax{i}.set_yticks([])') plt.show()
完整代码可通过学术咨询获得: