Advertisement
FelipeNeto2

Matlab Backup 2

Apr 1st, 2024 (edited)
1,247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 5.81 KB | None | 0 0
  1. clear;
  2. clc;
  3.  
  4. % Parâmetros globais
  5. Sro = 0;      % Saturação residual do óleo
  6. Srw = 0;     % Saturação residual da água
  7. phi = 1;          % Porosidade
  8. V = 1;            % Velocidade
  9. a = 0.5;         % Multiplicador de viscosidade
  10. L = 3;            % Comprimento do domínio
  11. T = 1;            % Tempo percorrido
  12.  
  13. % Função Krw e Kro
  14. nw = 2;
  15. no = 2;
  16. krwm = 1;
  17. krom = 1;
  18. Krw = @(Sw) krwm .* ((Sw - Srw) ./ (1 - Srw - Sro)).^nw;
  19. Kro = @(Sw) krom .* ((1 - Sw - Sro) ./ (1 - Srw - Sro)).^no;
  20.  
  21. % Função fw
  22. fw = @(Sw) Krw(Sw) ./ (Krw(Sw) + a * Kro(Sw));
  23.  
  24. % Derivadas das funções
  25. dfw = @(Sw) (krwm*((Srw - Sw)/(Sro + Srw - 1))^nw*((krwm*nw*((Srw - Sw)/(Sro + Srw - 1))^(nw - 1))/(Sro + Srw - 1) - (a*krom*no*((Sro + Sw - 1)/(Sro + Srw - 1))^(no - 1))/(Sro + Srw - 1)))/(krwm*((Srw - Sw)/(Sro + Srw - 1))^nw + a*krom*((Sro + Sw - 1)/(Sro + Srw - 1))^no)^2 - (krwm*nw*((Srw - Sw)/(Sro + Srw - 1))^(nw - 1))/((krwm*((Srw - Sw)/(Sro + Srw - 1))^nw + a*krom*((Sro + Sw - 1)/(Sro + Srw - 1))^no)*(Sro + Srw - 1));
  26. d2fw = @(Sw) (2*krwm*((Srw - Sw)/(Sro + Srw - 1))^nw*((krwm*nw*((Srw - Sw)/(Sro + Srw - 1))^(nw - 1))/(Sro + Srw - 1) - (a*krom*no*((Sro + Sw - 1)/(Sro + Srw - 1))^(no - 1))/(Sro + Srw - 1))^2)/(krwm*((Srw - Sw)/(Sro + Srw - 1))^nw + a*krom*((Sro + Sw - 1)/(Sro + Srw - 1))^no)^3 - (krwm*((Srw - Sw)/(Sro + Srw - 1))^nw*((krwm*nw*((Srw - Sw)/(Sro + Srw - 1))^(nw - 2)*(nw - 1))/(Sro + Srw - 1)^2 + (a*krom*no*((Sro + Sw - 1)/(Sro + Srw - 1))^(no - 2)*(no - 1))/(Sro + Srw - 1)^2))/(krwm*((Srw - Sw)/(Sro + Srw - 1))^nw + a*krom*((Sro + Sw - 1)/(Sro + Srw - 1))^no)^2 + (krwm*nw*((Srw - Sw)/(Sro + Srw - 1))^(nw - 2)*(nw - 1))/((krwm*((Srw - Sw)/(Sro + Srw - 1))^nw + a*krom*((Sro + Sw - 1)/(Sro + Srw - 1))^no)*(Sro + Srw - 1)^2) - (2*krwm*nw*((Srw - Sw)/(Sro + Srw - 1))^(nw - 1)*((krwm*nw*((Srw - Sw)/(Sro + Srw - 1))^(nw - 1))/(Sro + Srw - 1) - (a*krom*no*((Sro + Sw - 1)/(Sro + Srw - 1))^(no - 1))/(Sro + Srw - 1)))/((krwm*((Srw - Sw)/(Sro + Srw - 1))^nw + a*krom*((Sro + Sw - 1)/(Sro + Srw - 1))^no)^2*(Sro + Srw - 1));
  27.  
  28. % % Ponto de inflexão
  29. Sc = fsolve(d2fw, 0.5);
  30.  
  31. % Parâmetros para a solução numérica
  32. n = 200;         % Número de pontos
  33. max_iter = 100;  % Máximo de iterações
  34. tol = 1e-6;      % Tolerância
  35.  
  36. dx = L / (n - 1);
  37. x_num = linspace(dx/2, L-dx/2, n-1);  % Malha espacial centralizada
  38.  
  39. dt = 100 / 1000;
  40. t = 0:dt:T;  % Malha temporal
  41.  
  42. % Inicialização das soluções anteriores com as condições iniciais
  43. S_ant = Srw * ones(n-1, 1);
  44.  
  45. % Parâmetro da solução numérica
  46. alpha = dx / V;
  47.  
  48. % Tempos que serão plotados
  49. tempos = [0.5, 1];
  50.  
  51. % Método do Ponto Fixo Modificado
  52. S_k1 = zeros(n-1,1);
  53. for j = 2:length(t)
  54.     S_k = Sc*ones(n-1,1);
  55.    
  56.     for iter = 1:max_iter
  57.         for i = 1:n-1  
  58.             if i == 1                
  59.                 beta = fw(1-Sro) / alpha;
  60.                
  61.                 g = fw(S_k(i)) + (alpha / dt) * S_k(i);  % Função g
  62.                 dg = dfw(S_k(i)) + alpha / dt;  % Função g'
  63.                
  64.                 gama = alpha * (beta + (S_ant(i)) / dt);
  65.                
  66.                 % Atualização da saturação
  67.                 S_new = S_k(i) + (gama - g) / dg;
  68.                 S_k1(i) = max(0, min(1, S_new));  
  69.             else                
  70.                 beta = (fw(S_k(i-1)) + dfw(S_k(i-1)) * (S_k1(i-1) - S_k(i-1))) / alpha;              
  71.  
  72.                 g = fw(S_k(i)) + (alpha / dt) * S_k(i);
  73.                 dg = dfw(S_k(i)) + alpha / dt;
  74.                
  75.                 gama = alpha * (beta + (S_ant(i)) / dt);
  76.              
  77.                 % Atualização da saturação
  78.                 S_new = S_k(i) + (gama - g) / dg;
  79.                 S_k1(i) = max(0, min(1, S_new));  
  80.             end
  81.            
  82.             % Passo que garante a incondicionalidade da convergência
  83.             if d2fw(S_k1(i)) * d2fw(S_k(i)) < 0
  84.                 %S_k1(i) = (S_k1(i) + S_k(i))/2;
  85.                 S_k1(i) = Sc;
  86.             end  
  87.         end        
  88.  
  89.         % Verificação do critério de convergência
  90.         if norm((S_k1 - S_k) / S_k1) < tol
  91.             break;
  92.         end
  93.        
  94.         S_k = S_k1;
  95.     end
  96.    
  97.     % Atualização da solução anterior
  98.     S_ant = S_k1;
  99.    
  100.     % Plot das soluções em tempos especificados
  101.     if ismember(t(j), tempos)
  102.         plot(x_num, S_ant, 'DisplayName', sprintf('Numérica t = %.2f', t(j)));
  103.         hold on;
  104.     end
  105. end
  106.  
  107. % Malha espacial da analítica
  108. dx_ana = 0.001;
  109. x_ana = 0:dx_ana:L;
  110.  
  111. % Malha temporal da analítica
  112. dt_ana = 0.1 / 1000;
  113. t_ana = 0:dt_ana:T;
  114.  
  115. % Função Krw e Kro para a solução analítica
  116. Krw_ana = @(Sw) krwm * ((Sw - Srw) / (1 - Srw - Sro)).^nw;
  117. Kro_ana = @(Sw) krom * ((1 - Sw - Sro) / (1 - Srw - Sro)).^no;
  118. fw_ana = @(Sw) Krw_ana(Sw) ./ (Krw_ana(Sw) + a * Kro_ana(Sw));
  119. dKrw_ana = @(Sw) krwm * nw * ((Sw - Srw).^(nw - 1)) / (1 - Srw - Sro).^nw;
  120. dKro_ana = @(Sw) -krom * no * ((1 - Sw - Sro).^(no - 1)) / (1 - Srw - Sro).^no;
  121. dfw_ana = @(Sw) a * (dKrw_ana(Sw) .* Kro_ana(Sw) - Krw_ana(Sw) .* dKro_ana(Sw)) ./ (Krw_ana(Sw) + a * Kro_ana(Sw)).^2;
  122.  
  123. % Função para encontrar a raiz
  124. func = @(Sw) dfw_ana(Sw) .* (Sw - Srw) - fw_ana(Sw) + fw_ana(Srw);
  125.  
  126. % Encontra a raiz de func(Sw)
  127. Chute_inicial = 0.7;
  128. Sw_choque = fsolve(func, Chute_inicial);
  129.  
  130. % Loop principal para a solução analítica
  131. for t_val = tempos
  132.     Sw_rf = linspace(1 - Sro, Sw_choque, 1000);
  133.     x_rf = zeros(1, length(Sw_rf));
  134.  
  135.     x_choque = (V * t_val / phi) * dfw_ana(Sw_choque);
  136.     for k = 1:length(Sw_rf)
  137.         x_rf(k) = (V * t_val / phi) * dfw_ana(Sw_rf(k));
  138.     end
  139.  
  140.     sw = [Sw_rf, Srw, Srw];
  141.     xw = [x_rf, x_choque, L];
  142.     plot(xw, sw, 'DisplayName', sprintf('Analítica t = %.2f', t_val));
  143.     hold on;
  144. end
  145.  
  146. xlabel('x');
  147. ylabel('Sw');
  148. title('Comparação da Solução Numérica e Analítica de Buckley-Leverett');
  149. legend('show');
  150. grid on;
  151. hold off;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement