Spis treści

Lab 5-9

Zajęcia 2

y=[0.67 0.67 0.67 0.67 0.67 0.02 0.02 0.02 0.02];
 
temp = 727;
R = 8.3144;
Q = 140000;
temp_k = temp + 273;
d0= 0.000041;
D = d0 * exp( -Q /( R * temp_k)) * 1 * 10^10;
 
dt = 1;
dx = 1;
 
tmp = (D*dt)/dx^2;
 
n = 100;
[s_h s_w] = size(y);
 
y2 = zeros(1, s_w);
 
for j = 1:n
    for i = 1:s_w
 
        im = i-1;
        ip = i+1;
        if im < 1
            im = 1;
        end
        if ip > s_w
            ip = s_w;
        end
        y2(i) = (1 - 2*tmp)*y(i) + tmp*(y(im) + y(ip));
 
    end
 
    y = y2;
end
 
plot(y2, 'DisplayName', 'y2', 'yDataSource', 'y2');

Zajęcia 3

temp = 727;
R = 8.3144;
Q = 140000;
temp_k = temp + 273;
d0= 0.000041;
D = d0 * exp( -Q /( R * temp_k)) * 1 * 10^10;
 
dt = 0.01;
dx = 0.1;
pN = 0.1;
 
if (D*dt)/dx^2 <= 0.5
 
    % Obszar rozwiązania: 100 um    
    %y=[0.67 0.67 0.67 0.67 0.67 0.02 0.02 0.02 0.02];
    y(1:5) = 0.67;
    y(6:100) = 0.02;
 
    ksi = 6;
    for k = 0:dt:10
 
        y = [y(1), y, y(length(y))];
        y1 = y;
 
        for i = 2:1:ksi+1
           y1(i) = D *( dt / dx^2 ) * ( y(i+1) + y(i-1)) + y(i) * (1 - 2*D*(dt/dx^2));
        end
 
        y = y1;
        y = y(2:1:length(y)-1);
 
        plot(y)
        hold on
 
        % rownanie prostej przechodzacej przez dwa punkty
        % (x2 - x1)(y - y1) = (y2 - y1)(x - x1)
        yLine = -0.00407 * temp_k + 3.715;
 
        % zwiekszenie ksi 
        if y(ksi) >= yLine && ksi < length(y)-1
            ksi = ksi + 1;
        end
 
        % zwiekszenie temperatury o zadany prog i kolejna iteracja
        temp_k = temp_k + pN * dt;
        D = d0 * exp( -Q /( R * temp_k)) * 1 * 10^10;
 
    end
   % disp(y);
 
end

Drugi Program

temp = 780;
Q = 140000; 
R = 8.3144;
temp_k = temp + 273; 
d0 = 0.000041;
D=d0*exp(-Q /(R * temp_k))*1E10 ;
dt = 0.01; 
dx = 0.1; 
pN = 0;
time = 50;
%Warunek początkowy NEUMANA
if (D*dt)/dx^2<=0.5
 
    K(6:100) = 0.02; %wypełniamy 6-100 elementy stężeniem o wielkości 0.2
    K(1:5) = 0.67; %wypełniamy 1-5 elementy stężeniem o wielkości 0.67
    ksi = 6; %ustawiamy na którym elemencie jest granica ksi
 
    Clen = int32(time/dt); %obliczamy ilość kroków
    C(1:Clen) = 0.0; %tworzymy tablicę wypełnioną zerami do której będzie 
    %obliczane stężenie całego materiału w każdym kroku czasowym
    l = 1; %iterator powyższej tablicy
 
    for k = 0:dt:time %zaczynamy proces
 
        C(l) = trapz(K); %do tablicy zapisujemy stężenie w materiale
        l = l + 1;
 
        K = [K(1), K, K(length(K))]; %zwiększamy rozmiar tablicy z lewej i z prawej strony
        K1 = K; %przepisujemy tablicę do tablicy pomocniczej (k+1)
        K(ksi+1) = K(ksi); %powielamy element graniczny do obliczeń
        for i = 2:1:ksi+1 %obliczamy stężenie do granicy
           K1(i) = D*(dt/dx^2)*(K(i+1)+K(i-1)) + K(i)*(1 - 2*D*(dt/dx^2));
           %obliczanie stężenia dla i-tego elementu
        end
 
        K = K1; %przepisanie tablicy spowrotem
        K = K(2:1:length(K)-1); %zmniejszenie rozmiaru tablicy do stanu początkowego
 
        if (mod(l,100) == 2) %wyświetlamy co 100 element na podstawie iteratora
            plot(K) %wyświetlamy wykres stężenia w materiale
            hold on
        end
 
        y=-0.004074074074074075*temp+3.7155555555555555;
        %na podstawie wyznaczonego wzoru na prostą G-S wyliczamy stężenie
        %dla danej temperatury
        if K(ksi) >= y && ksi < length(K)-1 %jeśli stężenie jest wyższe 
            %niż G-S i ksi nie jest ostatnim elementem to zwiększamy granicę
            ksi = ksi + 1;
        end
 
        temp = temp + pN * dt; %zwiększamy co krok temperaturę
        temp_k = temp + 273;
        D=d0*exp(-Q /(R * temp_k))*1E10; %ponownie obliczamy wsp. dyfuzji
        if (D*dt)/dx^2>0.5 %sprawdzamy czy warunek NEUMANNA nadal jest spełniony
            disp('warunek neumanna przestal byc spelniony dla temp');
            disp(temp);
            break;
        end
    end
    figure;
    plot(C); %wyświetlamy wykres zmiany stężenia co krok
end

Drugi Program Maciek

temp = 780;
Q = 140000; 
R = 8.3144;
temp_k = temp + 273; 
d0 = 0.000041;
D=d0*exp(-Q /(R * temp_k))*1E10 ;
dt = 0.01; 
dx = 0.1; 
pN = 0;
time = 50;
K(6:100) = 0.02; 
K(1:5) = 0.67; 
ksi = 6; 
 
Clen = int32(time/dt);
C(1:Clen) = 0.0; 
%Neuman
if (D*dt)/dx^2<=0.5
 
    j = 1;
    for k = 0:dt:time
 
        C(l) = trapz(K); %Calka
        j = j + 1;
        K = [K(1), K, K(length(K))];
        TempK = K;
        K(ksi+1) = K(ksi);
        for i = 2:1:ksi+1 
           TempK (i) = D*(dt/dx^2)*(K(i+1)+K(i-1)) + K(i)*(1 - 2*D*(dt/dx^2));
        end
 
        K = TempK;
        K = K(2:1:length(K)-1);
 
        if (mod(j,100) == 2)
            plot(K)
            hold on
        end
 
        y=-0.004074074074074075*temp+3.7155555555555555;
        %zwiekszanie granicy
        if K(ksi) >= y && ksi < length(K)-1 
            ksi = ksi + 1;
        end
 
        temp = temp + pN * dt;
        temp_k = temp + 273;
        D=d0*exp(-Q /(R * temp_k))*1E10;
        if (D*dt)/dx^2>0.5
            break;
        end
    end
    figure;
    plot(C);
end