Upwind, Central Differencing, and Upwind 2nd Order Solution to PDE
    5 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
Hello,
I am trying to find a solution to this PDE:
u* +v
+v =
=
 +v
+v =
=
u=sin(45)
v=cos(45)
 *10^-6
*10^-6The solution space is a 1X1 square with the following boundary conditions:
 @
 @ 
 @
 @ 
 @ x
 @ x @ x=1
 @ x=1 @ y=1
 @ y=1The goal is to compare central differencing, upwind, and upwind 2nd order solutions for ϕ at y=0.5 at the following grid sizes: 11X11, 21X21, and 41X41.
I wrote the following code, however, my professor says that it's incorrect. I tried putting it into the PDE Modeler in MATLAB and it gives me the same result as my upwind solution.
I'm lost at this point. Can someone please help?
Thank you!
clc
clear all
close all
% compare CD2 UD1, and UD2 on the same figure
% each figure will be for one resolution
% Need to use a mirror image for the north and east sides (the derivatives
% are equal to zero)
alpha=10^-6;
theta=45;
u=cosd(theta);
v=sind(theta);
grid_size=[11,21,41];
%grid_size=[11];
for k=1:length(grid_size)
    grid=linspace(0,1,grid_size(k));
    resolution(k)=grid(2)-grid(1);
    dx=resolution(k);
    dy=resolution(k);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%CD2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    A=zeros(grid_size(k)^2);
    %create general solution pattern
    %main diagonal
    for i=1:grid_size(k)^2
        A(i,i)=2*(alpha/dx^2+alpha/dy^2);
        B(i)=0;
    end
    %horizontals
    for i=1:grid_size(k)-1
        for j=1:grid_size(k)
            A(i+(j-1)*grid_size(k),i+(j-1)*grid_size(k)+1)=u/(2*dx)-alpha/dx^2;
            A(i+(j-1)*grid_size(k)+1,i+(j-1)*grid_size(k))=-u/(2*dx)-alpha/dx^2;
        end
    end
    %verticals
    for i=1:grid_size(k)
        for j=1:grid_size(k)-1
            A(i+(j-1)*grid_size(k),i+j*grid_size(k))=v/(2*dx)-alpha/dy^2;
            A(i+j*grid_size(k),i+(j-1)*grid_size(k))=-v/(2*dx)-alpha/dy^2;
        end
    end
    %establish boundary conditions
    %west boundary
    i=1;
    for j=1:grid_size(k):grid_size(k)^2
        A(j,:)=0;
        A(j,j)=1;
        if grid(i)<=0.2
            B(j)=1;
        end
        i=i+1;
    end
    %south boundary
    for i=1:grid_size(k)
        A(i,:)=0;
        A(i,i)=1;
        B(i)=1;
    end
    %north boundary
    %main diagonal
    for i=grid_size(k)^2-grid_size(k)+1:grid_size(k)^2
        A(i,:)=0;
        A(i,i)=2*alpha/dx^2;
        B(i)=0;
    end
    %horizontals
    for i=1:grid_size(k)-1
        for j=grid_size(k)
            A(i+(j-1)*grid_size(k),i+(j-1)*grid_size(k)+1)=u/(2*dx)-alpha/dx^2;
            A(i+(j-1)*grid_size(k)+1,i+(j-1)*grid_size(k))=-u/(2*dx)-alpha/dx^2;
        end
    end
    %east boundary
    %main diagonal
    for i=grid_size(k):grid_size(k):grid_size(k)^2
        A(i,:)=0;
        A(i,i)=2*alpha/dx^2;
        B(i)=0;
    end
    %verticals
    for i=grid_size(k)
        for j=1:grid_size(k)-1
            A(i+(j-1)*grid_size(k),i+j*grid_size(k))=v/(2*dx)-alpha/dy^2;
            A(i+j*grid_size(k),i+(j-1)*grid_size(k))=-v/(2*dx)-alpha/dy^2;
        end
    end
    %A=sparse(A);
    %B=sparse(B);
    %dA=decomposition(A);
    %phi_vector=dA\B';
    %phi_vector=A\B';
    %phi_vector=mldivide(A,B');
    phi_vector=linsolve(A,B');
    %phi_vector=inv(A)*B';
    for i=1:length(grid)
        for j=1:length(grid)
            phi_CD2(i,j)=phi_vector(length(grid)*(i-1)+j);
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%UD1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    clear A B phi_vector
    A=zeros(grid_size(k)^2);
    %create general solution pattern
    %main diagonal
    for i=1:grid_size(k)^2
        A(i,i)=u/dx+v/dy+2*(alpha/dx^2+alpha/dy^2);
        B(i)=0;
    end
    %horizontals
    for i=1:grid_size(k)-1
        for j=1:grid_size(k)
            A(i+(j-1)*grid_size(k),i+(j-1)*grid_size(k)+1)=-alpha/dx^2;
            A(i+(j-1)*grid_size(k)+1,i+(j-1)*grid_size(k))=-u/(2*dx)-alpha/dx^2;
        end
    end
    %verticals
    for i=1:grid_size(k)
        for j=1:grid_size(k)-1
            A(i+(j-1)*grid_size(k),i+j*grid_size(k))=-alpha/dy^2;
            A(i+j*grid_size(k),i+(j-1)*grid_size(k))=-v/(2*dx)-alpha/dy^2;
        end
    end
    %establish boundary conditions
    %west boundary
    i=1;
    for j=1:grid_size(k):grid_size(k)^2
        A(j,:)=0;
        A(j,j)=1;
        if grid(i)<=0.2
            B(j)=1;
        end
        i=i+1;
    end
    %south boundary
    for i=1:grid_size(k)
        A(i,:)=0;
        A(i,i)=1;
        B(i)=1;
    end
    %north boundary
    %main diagonal
    for i=grid_size(k)^2-grid_size(k)+1:grid_size(k)^2
        A(i,:)=0;
        A(i,i)=u/dx+2*alpha/dx^2;
        B(i)=0;
    end
    %horizontals
    for i=1:grid_size(k)-1
        for j=grid_size(k)
            A(i+(j-1)*grid_size(k),i+(j-1)*grid_size(k)+1)=-alpha/dx^2;
            A(i+(j-1)*grid_size(k)+1,i+(j-1)*grid_size(k))=-u/(2*dx)-alpha/dx^2;
        end
    end
    %east boundary
    %main diagonal
    for i=grid_size(k):grid_size(k):grid_size(k)^2
        A(i,:)=0;
        A(i,i)=v/dy+2*alpha/dx^2;
        B(i)=0;
    end
    %verticals
    for i=grid_size(k)
        for j=1:grid_size(k)-1
            A(i+(j-1)*grid_size(k),i+j*grid_size(k))=-alpha/dy^2;
            A(i+j*grid_size(k),i+(j-1)*grid_size(k))=-v/(2*dx)-alpha/dy^2;
        end
    end
    %A=sparse(A);
    %B=sparse(B);
    %dA=decomposition(A);
    %phi_vector=dA\B';
    %phi_vector=mldivide(A,B');
    %phi_vector=A\B';
    %phi_vector=inv(A)*B';
    phi_vector=linsolve(A,B');
    for i=1:length(grid)
        for j=1:length(grid)
            phi_UD1(i,j)=phi_vector(length(grid)*(i-1)+j);
        end
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%UD2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    clear A B phi_vector
    A=zeros(grid_size(k)^2);
    %create general solution pattern
    %main diagonal
    for i=1:grid_size(k)^2
        A(i,i)=3*u/(2*dx)+3*v/(2*dy)+2*(alpha/dx^2+alpha/dy^2);
        B(i)=0;
    end
    %horizontals
    for i=1:grid_size(k)-2
        for j=1:grid_size(k)
            A(i+(j-1)*grid_size(k),i+(j-1)*grid_size(k)+1)=-alpha/dx^2;
            A(i+(j-1)*grid_size(k)+1,i+(j-1)*grid_size(k))=-3*u/(2*dx)-alpha/dx^2;
            A(i+(j-1)*grid_size(k)+2,i+(j-1)*grid_size(k))=3*u/(2*dx);
        end
    end
    %verticals
    for i=1:grid_size(k)
        for j=2:grid_size(k)-1
            A(i+(j-1)*grid_size(k),i+j*grid_size(k))=-alpha/dy^2;
            A(i+j*grid_size(k),i+(j-1)*grid_size(k))=-3*v/(2*dx)-alpha/dy^2;
            A(i+j*grid_size(k),i+(j-2)*grid_size(k))=3*v/(2*dx);
        end
    end
    %establish boundary conditions
    %west boundary
    i=1;
    for j=1:grid_size(k):grid_size(k)^2
        A(j,:)=0;
        A(j,j)=1;
        if grid(i)<=0.2
            B(j)=1;
        end
        i=i+1;
    end
    i=1;
    for j=2:grid_size(k):grid_size(k)^2
        A(j,:)=0;
        A(j,j)=1;
        if grid(i)<=0.2
            B(j)=1;
        end
        i=i+1;
    end
    %south boundary
    for i=1:grid_size(k)*2
        A(i,:)=0;
        A(i,i)=1;
        B(i)=1;
    end
    %north boundary
    %main diagonal
    for i=grid_size(k)^2-grid_size(k)+1:grid_size(k)^2
        A(i,:)=0;
        A(i,i)=3*u/(2*dx)+2*alpha/dx^2;
        B(i)=0;
    end
    %horizontals
    for i=1:grid_size(k)-2
        for j=grid_size(k)
            A(i+(j-1)*grid_size(k),i+(j-1)*grid_size(k)+1)=-alpha/dx^2;
            A(i+(j-1)*grid_size(k)+1,i+(j-1)*grid_size(k))=-3*u/(2*dx)-alpha/dx^2;
            A(i+(j-1)*grid_size(k)+2,i+(j-1)*grid_size(k))=3*u/(2*dx);
        end
    end
    %east boundary
    %main diagonal
    for i=grid_size(k):grid_size(k):grid_size(k)^2
        A(i,:)=0;
        A(i,i)=3*v/(2*dy)+2*alpha/dx^2;
        B(i)=0;
    end
    %verticals
    for i=grid_size(k)
        for j=2:grid_size(k)-1
            A(i+(j-1)*grid_size(k),i+j*grid_size(k))=-alpha/dy^2;
            A(i+j*grid_size(k),i+(j-1)*grid_size(k))=-3*v/(2*dx)-alpha/dy^2;
            A(i+j*grid_size(k),i+(j-2)*grid_size(k))=3*v/(2*dx);
        end
    end
    %A=sparse(A);
    %B=sparse(B);
    %dA=decomposition(A);
    %phi_vector=dA\B';
    %phi_vector=mldivide(A,B');
    %phi_vector=A\B';
    %phi_vector=inv(A)*B';
    phi_vector=linsolve(A,B');
    for i=1:length(grid)
        for j=1:length(grid)
            phi_UD2(i,j)=phi_vector(length(grid)*(i-1)+j);
        end
    end
    figure(k)
    subplot(2,2,1)
    surf(grid,grid,phi_CD2)
    shading interp
    xlabel('x')
    ylabel('y')
    title(['CD2',' ',num2str(length(grid)),'X',num2str(length(grid))])
    zlim([0 1])
    subplot(2,2,2)
    surf(grid,grid,phi_UD1)
    shading interp
    xlabel('x')
    ylabel('y')
    title(['UD1',' ',num2str(length(grid)),'X',num2str(length(grid))])
    zlim([0 1])
    subplot(2,2,3)
    surf(grid,grid,phi_UD2)
    shading interp
    xlabel('x')
    ylabel('y')
    title(['UD2',' ',num2str(length(grid)),'X',num2str(length(grid))])
    zlim([0 1])
    subplot(2,2,4)
    plot(grid,phi_CD2((grid_size(k)-1)/2,:))
    hold on
    plot(grid,phi_UD1((grid_size(k)-1)/2,:))
    plot(grid,phi_UD2((grid_size(k)-1)/2,:))
    title(['\phi at y=0.5',' ',num2str(length(grid)),'X',num2str(length(grid))])
    legend('CD2','UD1','UD2','Location','best')
    xlabel('x')
    ylabel('\phi')
end
0 Kommentare
Antworten (0)
Siehe auch
Kategorien
				Mehr zu General PDEs finden Sie in Help Center und File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
