Advertisement
FelipeNeto2

Matlab backup

Apr 1st, 2024 (edited)
1,176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.64 KB | None | 0 0
  1. clear;
  2. clc;
  3.  
  4. % Parâmetros
  5. Sro = 0.2;        % Saturação residual do óleo
  6. Srw = 0.2;        % 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 (0,L)
  11. T = 1;            % Tempo final
  12. n = 100;          % Número de pontos
  13. max_iter = 1000;  % Máximo de iterações
  14. tol = 1e-6;       % Tolerância
  15.  
  16. dx = L / (n - 1);
  17. x = linspace(dx/2, L - dx/2, n);  % Malha espacial centralizada
  18.  
  19. dt = 0.001;
  20. t = 0:dt:T;  % Malha temporal
  21.  
  22. % Parâmetros das permeabilidades relativas (Brooks & Corey)
  23. nw = 2;
  24. no = 2;
  25. krwm = 1;
  26. krom = 1;
  27.  
  28. Krw = @(Sw) krwm * ((Sw - Srw) / (1 - Srw - Sro)).^nw;
  29. Kro = @(Sw) krom * ((1 - Sw - Sro) / (1 - Srw - Sro)).^no;
  30.  
  31. % Função fracionária de fluxo da água
  32. fw = @(Sw) Krw(Sw) ./ (Krw(Sw) + a * Kro(Sw));
  33.  
  34. % Derivadas das funções
  35. dKrw = @(Sw) krwm * nw * ((Sw - Srw).^(nw - 1)) / (1 - Srw - Sro).^nw;
  36. dKro = @(Sw) -krom * no * ((1 - Sw - Sro).^(no - 1)) / (1 - Srw - Sro).^no;
  37.  
  38. dfw = @(Sw) a * (dKrw(Sw) .* Kro(Sw) - Krw(Sw) .* dKro(Sw)) ./ (Krw(Sw) + a * Kro(Sw)).^2;
  39.  
  40. % Inicialização da matriz B com as condições iniciais
  41. B = Srw * ones(n, 1);
  42. %B(1) = 1 - Sro;
  43.  
  44. % Inicialização da matriz solução
  45. S = B;
  46.  
  47. % Parâmetro da solução numérica
  48. alpha = dt/V;
  49.  
  50. % Tempos que serão plotados
  51. tempos = [0.5, 1];
  52.  
  53. S_k1 = S;
  54.  
  55. % Método de Newton
  56. for j = 2:length(t)
  57.     S_k = S;
  58.     for iter = 1:max_iter
  59.         for i = 1:n
  60.             if i == 1
  61.                 % Função fracionária de fluxo da água
  62.                 fw_i = fw(S_k(i));
  63.                 dw_i = dfw(S_k(i));
  64.                
  65.                 % Função g(S) e sua derivada g'(S)
  66.                 g = @(Sw) fw(Sw) + Sw * (alpha/dt);
  67.                 dg = @(Sw) dfw(Sw) + alpha/dt;
  68.                
  69.                 % Atualização da saturação usando a equação (11)
  70.                 S_prev = S_k(i);
  71.                 for m = 1:max_iter
  72.                     S_new = max(0, min(1, S_prev + (0.5 - g(S_prev)) / dg(S_prev))); % 0.5 é o valor de c_i utilizado
  73.                     if abs(S_new - S_prev) < tol
  74.                         break;
  75.                     end
  76.                     S_prev = S_new;
  77.                 end
  78.                
  79.                 S_k1(i) = S_new;
  80.             else
  81.                 % Função fracionária de fluxo da água
  82.                 fw_i_1 = fw(S_k(i - 1));
  83.                 fwi = fw(S_k(i));
  84.                 dw_i_1 = dfw(S_k(i - 1));
  85.                 dwi = dfw(S_k(i));
  86.                
  87.                 % Função g(S) e sua derivada g'(S)
  88.                 g = @(Sw) fw(Sw) + Sw * (alpha/dt);
  89.                 dg = @(Sw) dfw(Sw) + alpha/dt;
  90.                
  91.                 % Atualização da saturação usando a equação (11)
  92.                 S_prev = S_k(i);
  93.                 for m = 1:max_iter
  94.                     S_new = max(0, min(1, S_prev + (0.5 - g(S_prev)) / dg(S_prev))); % 0.5 é o valor de c_i utilizado
  95.                     if abs(S_new - S_prev) < tol
  96.                         break;
  97.                     end
  98.                     S_prev = S_new;
  99.                 end
  100.                
  101.                 S_k1(i) = S_new;
  102.             end
  103.         end
  104.        
  105.         % Verificação do critério de convergência
  106.         if norm((S_k1 - S_k) ./ S_k1) < tol
  107.             break;
  108.         end
  109.        
  110.         S_k = S_k1;
  111.     end
  112.    
  113.     S = S_k;
  114.    
  115.     if ismember(t(j), tempos)
  116.         plot(x, S, 'DisplayName', ['t = ', num2str(t(j))]);
  117.         hold on;
  118.     end
  119. end
  120.  
  121. xlabel('x');
  122. ylabel('Sw');
  123. title('Solução Numérica');
  124. legend;
  125. grid on;
  126. hold off;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement