[討論] dark soliton的邊界不收斂問題已回收

看板MATLAB作者 (千弦)時間14年前 (2011/10/14 18:57), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
大家好,我最近在解一個非線性薛丁格方程式如下: i*u_z+0.5*u_xx-|u|^2*u=0 預期收斂的結果會是u=1.0*tanh(x) 不過使用cheb當微分矩陣,邊界都會亂跳(理論上應該是水平) 僅提供目前我所做的code,但關於邊界條件還是不知道怎麼設才對,請大家講解一下 設法的原理,謝謝!!! N = 10; tol = 1e-6; D_c = 1.0; chi_c = 1.0; L = 10.0; [D,x] = cheb(N); % Compute Fourier second derivative x = L*x; % Rescale [0, 2pi] to [-L,L] D = (1/L)*D; D2=D^2; D2(1,:)=[1 zeros(1,N)]; D2(end,:)=[zeros(1,N) 1]; D2(:,1)=[1 zeros(1,N)]'; D2(:,end)=[zeros(1,N) 1]'; % initial guess mu = 1.0; % chemical potential wd = 1.0; u0 = 1.0*tanh(x); u0(1)=1; u0(N+1)=-1; subplot(2,1,1) u1 = 1.0*tanh(x); plot(x,abs(u0),x,abs(u1),'--'); u_del = i*ones(2*(N+1),1); ite_num = 0; ite_max = 50; while (ite_num < ite_max & norm(abs(u_del)) > tol) u_R = real(u0); u_I = imag(u0); Mat_A11 = mu*eye(N+1)+0.5*D_c*D2-2.0*chi_c*diag(abs(u0).*abs(u0))-1.0*chi_c*diag(u_R.*u_R-u_I.*u_I); Mat_A12 = -2.0*chi_c*diag(u_R.*u_I); Mat_A21 = -2.0*chi_c*diag(u_R.*u_I); Mat_A22 = mu*eye(N+1)+0.5*D_c*D2-2.0*chi_c*diag(abs(u0).*abs(u0))+1.0*chi_c*diag(u_R.*u_R-u_I.*u_I); Mat_A = [Mat_A11 Mat_A12; Mat_A21 Mat_A22]; vec_B1 = -1.0*(mu*u_R+0.5*D_c*D2*u_R-1.0*chi_c*diag(abs(u0).*abs(u0))*u_R); vec_B2 = -1.0*(mu*u_I+0.5*D_c*D2*u_I-1.0*chi_c*diag(abs(u0).*abs(u0))*u_I); vec_B = [vec_B1;vec_B2]; vec_Y = Mat_A\vec_B; u_del = vec_Y(1:N+1)+i*vec_Y(N+2:2*(N+1)); u_new = u0+u_del; ite_num = ite_num+1; err_norm = norm(abs(u_del)); fprintf(1,'norm of errors for %d-iterations = %f \n',ite_num, err_norm); u0 = u_new; end subplot(2,1,2) plot(x,abs(u_new),x,abs(u1),'--'); -- ※ 發信站 :批踢踢實業坊(ptt.cc) ◆ From: 111.251.208.140
文章代碼(AID): #1Ec1MrhH (MATLAB)