เงื่อนไขขอบเขตเป็นระยะสำหรับสมการความร้อนใน] 0,1 [


13

ขอให้เราพิจารณาสภาพเริ่มต้นที่ราบรื่นและสมการความร้อนในหนึ่งมิติ: ในช่วงเวลาที่เปิด] 0 , 1 [และให้เราคิดว่าเราต้องการแก้มันด้วยความแตกต่างแน่นอน

∂tu=∂xxu
]0,1[

ฉันรู้ว่าสำหรับปัญหาของฉันจะดีถูกวางฉันต้องยกมันด้วยเงื่อนไขขอบเขตที่และx = 1 ฉันรู้ว่า Dirichlet หรือ Neumann ทำงานได้ดีx=0x=1

ถ้าฉันมีในกรณีแรกการตกแต่งภายในชี้x k = kNสำหรับk=1,⋯,Nจากนั้นฉันมีNunknowns:uk=u(xk)สำหรับk=1,⋯,Nเพราะคุณถูกกำหนดไว้ที่ขอบเขตxk=kN+1k=1,⋯,NNuk=u(xk)k=1,⋯,Nu

ในกรณีที่สองฉันมีไม่ทราบแน่ชัดคุณ0 , ⋯ , u N + 1และฉันรู้วิธีใช้ (เป็นเนื้อเดียวกัน) Neumann BC เพื่อแยก Laplacian ที่ชายแดนเช่นแยกส่วนของจุดสมมติสองจุดx - 1และx N + 2และความเท่ากัน:N+2u0,⋯,uN+1x−1xN+2

u1−u−12h=0=uN+2−uN2h

คำถามของฉันเกี่ยวกับ BC เป็นระยะ ฉันมีความรู้สึกว่าฉันสามารถใช้สมการหนึ่งคือ แต่อาจจะสองและจากนั้นฉันจะใช้ ∂ x u ( 0 ) = ∂ x u ( 1 )

u(0)=u(1)
∂xu(0)=∂xu(1)

แต่ฉันไม่แน่ใจ ฉันไม่รู้ว่าฉันควรมีเท่าไร มันเป็นหรือไม่?N+1


คุณมีเงื่อนไขขอบเขต Dirichlet หรือ Neumann หรือไม่? จำนวนเซลล์ผีขึ้นอยู่กับลำดับของการประมาณค่าสำหรับเงื่อนไขขอบเขตของ Neumann ของคุณ
— ilciavo

@ilciavo, quesition เกี่ยวกับเงื่อนไขขอบเขตเป็นระยะ
— Bill Barth

คำตอบ:


8

u(0)=u(1)x=0x=1

x=1x=0N+1x0 xNxN x0

แผนผังของตารางธาตุ

∂∂t[x0x1⋮xN]=1Δx2[xN−2x0+x1x0−2x1+x2⋮xN−1−2xN+x0]

∂∂tx→=1Δx2Ax→
A=[−210⋯011−210⋯0⋱⋱⋱⋱⋱⋱0⋯01−2110⋯01−2].

แน่นอนว่าไม่จำเป็นต้องสร้างหรือเก็บเมทริกซ์นี้จริง ๆ ความแตกต่างอัน จำกัด ควรคำนวณได้ทันทีการดูแลเพื่อจัดการจุดแรกและจุดสุดท้ายตามต้องการ

∂tu=∂xxu+b(t,x)
x∈[−1,1)uRef(t,x)=exp⁡(−t)cos⁡(5πx)b(t,x)=(25π2−1)exp⁡(−t)cos⁡(5πx)
clear

% Solve: u_t = u_xx + b
% with periodic boundary conditions

% analytical solution:
uRef = @(t,x) exp(-t)*cos(5*pi*x);
b = @(t,x) (25*pi^2-1)*exp(-t)*cos(5*pi*x);

% grid
N = 30;
x(:,1) = linspace(-1,1,N+1);

% leave off 1 point so initial condition is periodic
% (doesn't have a duplicate point)
x(end) = [];
uWithMatrix = uRef(0,x);
uNoMatrix = uRef(0,x);

dx = diff(x(1:2));
dt = dx.^2/2;

%Iteration matrix:
e = ones(N,1);
A = spdiags([e -2*e e], -1:1, N, N);
A(N,1) = 1;
A(1,N) = 1;
A = A/dx^2;

%indices (left, center, right) for second order centered difference
iLeft = [numel(x), 1:numel(x)-1]';
iCenter = (1:numel(x))';
iRight = [2:numel(x), 1]';

%plot
figure(1)
clf
hold on
h0=plot(x,uRef(0,x),'k--','linewidth',2);
h1=plot(x,uWithMatrix);
h2=plot(x,uNoMatrix,'o');
ylim([-1.2, 1.2])
legend('Analytical solution','Matrix solution','Matrix-free solution')
ht = title(sprintf('Time t = %0.2f',0));
xlabel('x')
ylabel('u')
drawnow

for t = 0:dt:1
    uWithMatrix = uWithMatrix + dt*( A*uWithMatrix + b(t,x) );
    uNoMatrix = uNoMatrix + dt*(  ( uNoMatrix(iLeft) ...
                                - 2*uNoMatrix(iCenter) ...
                                  + uNoMatrix(iRight) )/dx^2 ...
                                + b(t,x) );
    set(h0,'ydata',uRef(t,x))
    set(h1,'ydata',uWithMatrix)
    set(h2,'ydata',uNoMatrix)
    set(ht,'String',sprintf('Time t = %0.2f',t))
    drawnow
end

แปลงสภาพเริ่มต้น

แปลงที่ t = 0.5

พล็อตของการแก้ปัญหาที่ t = 1.0

แปลงที่ t = 2.0


1
ทางออกที่ยอดเยี่ยมและเรียบง่าย !! ในกรณีที่มีคนต้องการที่นี่การใช้งานใน Python
— ilciavo

x

@ bela83 คุณถูกต้องแล้วว่าไม่จำเป็นต้องระบุอะไรมากไปกว่าเงื่อนไขเริ่มต้น การทำเช่นนั้นจะส่งผลให้ระบบมีการกำหนดเกินจริง สิ่งที่คุณต้องทำคือระวังให้ใกล้จุดสิ้นสุดของช่วงเวลาเล็กน้อยเพื่อให้แน่ใจว่าคุณห่อสิ่งต่าง ๆ รอบ ๆ เป็นระยะอย่างถูกต้อง มีวิธีที่ถูกต้องมากมายในการทำเช่นนี้
— Doug Lipinski

-1

ตามนี้คุณควรกำหนดเงื่อนไขขอบเขตเป็นระยะดังนี้:

u(0,t)=u(1,t)ux(0,t)=ux(1,t)

วิธีหนึ่งในการทำให้สมการความร้อนโดยปริยายคือการใช้ออยเลอร์ย้อนหลังคือ

un+1−unΔt=ui+1n+1−2uin+1+ui+1n+1Δx2

การแก้ระบบสมการ

[I−ΔtΔx2A][u1n+1u1n+1⋮uNn+1]=[u1nu2n⋮uNn]

A=[−21000…01−2100…001−210…0001−21…00001−2…0⋮⋮⋮⋮⋱⋱⋮000…01−2]

u0uN+1

u1−uN=0u2−u02Δx−uN+1−uN−12Δx=0

ux

[0100…0−10−1010…10−100000I−ΔtΔx2A0000000][u0n+1u1n+1u2n+1uNn+1uN+1n+1]=[00u1nu2nuNn]

ซึ่งให้สมการ N + 2 และ N + 2 ไม่ทราบ

นอกจากนี้คุณยังสามารถกำจัดสมการและเซลล์ผีแรกและมาถึงระบบของสมการ N และ N unknowns


u−1uNuN]0,1[xk=kN+1xN=NN+1

Nu0uN−1u−1uNu1uNu0uN+1

u0=uN+1N+1

uxu(0,t)=u(1,t)ux(0,t)=ux(1,t)

1
u1 = uN เพิ่มข้อ จำกัด เพิ่มเติม (สมการ u1 − uN = 0) ให้กับระบบของคุณ
— ilciavo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.