Equazione diffusione Condizioni al limite matlab
Salve a tutti,
scrivo perché ho un problema nella soluzione dell'equazione di diffusione 1D, con matlab
Il problema è il seguente, per $t>0$ e $x\in[0,1]$:
$\frac{\partial T}{\partial t}-\frac{\partial^2 T}{\partial x^2}=0$ con condizioni al limite $T(x=0,t)=T(x=1,t)=0$ e condizione iniziale $T(x,t=0)=\sin(\pix)$.
Ho risolto il problema con le eulero implicito per la parte temporale e derivata centrata per la derivata seconda.
Il problema che ritrovo è illustrato nelle immagini, per $\Delta t=0.1$
$\Deltax=0.005$

$\Deltax=0.01$

Quando scelgo un $\Delta x$ troppo alto, la soluzione non rispetta le condizioni al limite.
é normale o c'è qualche fenomeno che non prendo in considerazione ?
Grazie
scrivo perché ho un problema nella soluzione dell'equazione di diffusione 1D, con matlab
Il problema è il seguente, per $t>0$ e $x\in[0,1]$:
$\frac{\partial T}{\partial t}-\frac{\partial^2 T}{\partial x^2}=0$ con condizioni al limite $T(x=0,t)=T(x=1,t)=0$ e condizione iniziale $T(x,t=0)=\sin(\pix)$.
Ho risolto il problema con le eulero implicito per la parte temporale e derivata centrata per la derivata seconda.
Il problema che ritrovo è illustrato nelle immagini, per $\Delta t=0.1$
$\Deltax=0.005$

$\Deltax=0.01$

Quando scelgo un $\Delta x$ troppo alto, la soluzione non rispetta le condizioni al limite.
é normale o c'è qualche fenomeno che non prendo in considerazione ?
Grazie
Risposte
Come imponi le condizioni al bordo?
Salve, grazie per la risposta, ecco il codice completo.
Inserisco le condizioni al limite come un termine noto supplementare nella parte dove risolvo il sistema implicito
Inserisco le condizioni al limite come un termine noto supplementare nella parte dove risolvo il sistema implicito
clear all close all clc L=1; Dt=0.01; alpha=1; Dx=0.05; N=ceil(L/Dx)-1; s=alpha*Dt/Dx^2;% numero di Courant x=linspace(0,1,N); % VALORI PER LE CL DI DIRICHLET cl1=0; cl2=0; for i=1:N for j=1:N if i==j A(i,j)=1+2*s; elseif j==i+1 || j==i-1 A(i,j)=-s; end end end %%CI U(:,1)=sin(pi*x); %CL CL=[cl1*s;zeros(N-2,1);cl2*s]; for t=1:20 U(:,t+1)=A\(U(:,t)+CL); end
Detta così non mi suona familiare... Tra l'altro il tuo vettore CL è tutto zeri, quindi in questo caso è come se tu non stessi facendo proprio niente.
Il modo più comune per imporre le condizioni di Dirichlet con le differenze finite è di imporre direttamente il valore nel nodo interessato: in questo modo la prima riga della tua matrice \(A\) diventerebbe \((1 \ 0 \dots 0)\) ed il primo elemento del termine noto diventerebbe \(cl_1 = 0\); similmente il nodo finale.
Conosci questo metodo?
Il modo più comune per imporre le condizioni di Dirichlet con le differenze finite è di imporre direttamente il valore nel nodo interessato: in questo modo la prima riga della tua matrice \(A\) diventerebbe \((1 \ 0 \dots 0)\) ed il primo elemento del termine noto diventerebbe \(cl_1 = 0\); similmente il nodo finale.
Conosci questo metodo?
Grazie della risposta, mi hai risolto un grosso dubbio !!
Ne approfitto per farti un'altra domanda, sul metodo di Crank-Nicolson.
Se lo impiqgo per risolvere il problema della diffusione con condizioni iniziali costanti a tratti e condizioni al limite di dirichlet, ottengo questa soluzione artistica:

Il problema che risolvo è,
$A_i U^{n+1}=A_e U^n$, (so che non é il massimo della vita)
Immagino che il problema sia sempre legato all'imposizione delle condizioni al limite ?
Il codice
Ne approfitto per farti un'altra domanda, sul metodo di Crank-Nicolson.
Se lo impiqgo per risolvere il problema della diffusione con condizioni iniziali costanti a tratti e condizioni al limite di dirichlet, ottengo questa soluzione artistica:

Il problema che risolvo è,
$A_i U^{n+1}=A_e U^n$, (so che non é il massimo della vita)
Immagino che il problema sia sempre legato all'imposizione delle condizioni al limite ?
Il codice
L=1; Dt=0.01; alpha=1; Dx=0.001; N=ceil(L/Dx)-1; s=alpha*Dt/Dx^2; x=linspace(0,1,N); cl1=6; cl2=3; for i=1:N for j=1:N if i==j AI(i,j)=1+s; AE(i,j)=1-s; elseif j==i+1 || j==i-1 AI(i,j)=-s/2; AE(i,j)=s/2; end end end % CI ispa=mod(N,2); if ispa==0 U(:,1)=[cl1*ones(N/2,1);cl2*ones(N/2,1)]; else U(:,1)=[cl1*ones(ceil(N/2),1);cl2*ones(floor(N/2),1)]; end AI(1,:)=[1,zeros(1,N-1)]; AI(N,:)=[zeros(1,N-1),1]; AE(1,:)=[1,zeros(1,N-1)]; AE(N,:)=[zeros(1,N-1),1]; for t=1:20 U(:,t+1)=AI\(AE*U(:,t)); end