【发布时间】:2021-05-18 02:18:43
【问题描述】:
我写了一个小代码来验证( x + d/dx ) exp(-x^2 / 2 ) = 0。这个想法是使用傅立叶级数exp( 2 * pi j n x / L ) 和足够大的L 来表示高斯并在那里执行操作。
Matlab 中的算法工作原理如下:
function[] = verify
epsilon = 0.05; % step-size numerical integration
N = 40; % number of Fourier coefficients
L = 30; % window length numerical integration Fourier basis
X = -L / 2:epsilon:L / 2; % grid
xFourier = zeros(2 * N + 1); %Allocate space for Fourier coefficients of f(x)=x
inix = zeros(2 * N + 1); % Allocate space for Fourier coefficients of f(x)=exp(-x^2/2)
% Compute Fourier coefficients of f(x)=x
for i1=-N:N
A = X.*exp(-2 * pi * 1i * i1. * X / L ) / sqrt( L );
xFourier(i1 + ( N + 1 ) ) = trapz( X, A );
end
% Compute Fourier coefficients of f(x)=exp(-x^2/2)
for i1 = -N : N
A = 1 / sqrt(L) * exp(-X.^2 / 2 ). * exp(-2 * pi * 1i * i1. * X / L );
inix( i1 + N + 1 ) = trapz( X, A ); % These are the Fourier coefficients of the |x|^2*Gaussian part
end
TO = Hamilton( N, xFourier, L );
norm( TO * inix' )
end
所以上述算法的核心是我调用的函数 Hamilton,它包含运算符 x d/dx 的矩阵表示,这就是为什么 norm( TO * inix' ) 应该返回接近零的值,但它没有(? ) 函数 Hamilton 如下
function [ Hamilton ] = Hamilton( N, xFourier, L)
Hamilton = zeros( ( 2 * N + 1 ),( 2 * N + 1 ) );
for i1 = -N : N
for i2 = -N : N
if i1 == i2
Hamilton(
(i1 + ( N + 1 ) ), ( i2 + ( N + 1 ) )
) = Hamilton(
( i1 + ( N + 1)),( i2 + ( N + 1 ) )
) + 1i * 2 * pi / L * i1;
end
if abs( i2 - i1 ) <= N
Hamilton(
( i1 + ( N + 1 ) ), ( i2 + ( N + 1 ) )
) = Hamilton(
(i1 + ( N + 1 ) ), ( i2 + ( N + 1 ) )
) + xFourier( i1 - i2 + ( N + 1 ) );
end
end
end
end
有人看出错误了吗?
【问题讨论】:
-
本站没有 LaTex 格式,请edit您的问题以改进语法(并提高可读性)。还请在您的预期输出周围包含更多上下文 - “应该接近零”是您在此处没有支持的情况下所说的内容,目前尚不清楚这是否错误或代码中的某些内容是否错误,并且没有提供您的数学'正在尝试实施,我们很难猜测是哪种情况
-
为什么会有一个和函数同名的变量?请为您的代码选择一致的缩进和间距。
标签: matlab math numerical-methods differential-equations