Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2014
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.99 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cmath>
  4. #include <fstream>
  5. #include <cstdlib>
  6.  
  7. using namespace std;
  8. double E = 2.718281828459;
  9. double Ka = 0.00159833;
  10. double KET = 0.0959 / 60;
  11.  
  12. double rungeKutta2();
  13. double rungeKutta4();
  14. double eulerSimples();
  15.  
  16. void metodoBissecao();
  17. void metodoCorda();
  18. void picardPeano();
  19.  
  20. double rungeKutta4Sistema();
  21.  
  22. double funcao1(int minutos, double concAtual);
  23. double funcaoMi(int minutos, double mi);
  24. double funcaoMp(int minutos, double mi, double mp);
  25.  
  26. double volumePlasma = 3.5; // Em mL
  27. double ket = 0.00159833333 * volumePlasma; // constante de eliminacao por minuto em mL/min
  28.  
  29. int main() {
  30.  
  31.     cout
  32.             << "Calculo dos valores associados à administracao de de ceftazidima pela via intravenosa"
  33.             << endl << endl;
  34.     cout << "Que metodo numerico deseja utilizar para o calculo?" << endl
  35.             << endl;
  36.     cout << "1: Runge-Kutta segunda ordem (Concentracao, modelo linear)"
  37.             << endl;
  38.     cout << "2: Runge-Kutta quarta ordem (Concentracao, modelo linear)" << endl;
  39.     cout << "3: Euler Simples (Concentracao, modelo linear)" << endl;
  40.  
  41.     cout << "4: Metodo Bissecao  (Cálculo de Ka) " << endl;
  42.     cout << "5: Metodo Corda (Cálculo de Ka) " << endl;
  43.     cout << "6: Metodo Picard-Peano (Cálculo de Ka) " << endl;
  44.  
  45.     cout
  46.             << "7: Runge-Kutta quarta ordem para sistemas de equacoes(Concentracao, modelo bi-compartimental)"
  47.             << endl;
  48.  
  49.     int selecao;
  50.     cin >> selecao;
  51.     if (cin.fail()) {
  52.         cout << "Por favor introduza um inteiro.";
  53.         system("pause");
  54.         selecao = 0;
  55.     }
  56.     switch (selecao) {
  57.     case 1:
  58.         rungeKutta2();
  59.         break;
  60.     case 2:
  61.         rungeKutta4();
  62.         break;
  63.     case 3:
  64.         eulerSimples();
  65.         break;
  66.     case 4:
  67.         metodoBissecao();
  68.         break;
  69.     case 5:
  70.         metodoCorda();
  71.         break;
  72.     case 6:
  73.         picardPeano();
  74.         break;
  75.     case 7:
  76.         rungeKutta4Sistema();
  77.         break;
  78.     default:
  79.         main();
  80.     }
  81.  
  82.     system("pause");
  83.     main();
  84.     return 0;
  85. }
  86.  
  87. double rungeKutta2() {
  88.     int minutos = 0; //começa em t = 0
  89.     int nAdministracoes = 0; //começa com a primeira administraçao
  90.     double concAtual = 0; //Inicializar concentraçao
  91.     double h = 1; //Passo: de 1 em 1 minuto
  92.  
  93.     ofstream file;
  94.     file.open("Runge-Kutta2.txt");
  95.  
  96.     cout << "Metodo de Runge-Kutta 2 ordem" << endl << endl;
  97.     file << "[";
  98.  
  99.     while (nAdministracoes < 6) {
  100.  
  101.         if ((minutos % (60 * 12)) == 0) {
  102.             nAdministracoes++;
  103.         }
  104.         minutos++;
  105.         concAtual += funcao1(minutos,
  106.                 concAtual + h * funcao1(minutos, concAtual) / 2);
  107.         file << "[" << minutos << ", " << concAtual << "], ";
  108.     }
  109.     file << "]";
  110.     cout << "Concentracao ao fim de 3 dias: " << concAtual << endl;
  111.     return concAtual;
  112.  
  113. }
  114. double rungeKutta4() { ///Runge-Kutta 4ªordem
  115.     int minutos = 0; //começa em t = 0
  116.     int nAdministracoes = 0; //começa com a primeira administraçao
  117.     double concAtual = 0; //Inicializar concentraçao
  118.     double h = 1; //Passo: de 1 em 1 minuto
  119.     double xn = 0;
  120.     double d1, d2, d3, d4;
  121.  
  122.     ofstream file;
  123.     file.open("Runge-Kutta4.txt");
  124.     cout << "Metodo de Runge-Kutta 4 ordem" << endl << endl;
  125.     file << "[";
  126.  
  127.     while (nAdministracoes < 6) {
  128.  
  129.         if ((minutos % (60 * 12)) == 0) {
  130.             nAdministracoes++;
  131.         }
  132.         minutos++;
  133.         d1 = h * funcao1(minutos, concAtual);
  134.         d2 = h * funcao1(minutos + (h / 2), concAtual + (d1 / 2));
  135.         d3 = h * funcao1(minutos + (h / 2), concAtual + (d2 / 2));
  136.         d4 = h * funcao1(minutos + h, concAtual + (d3));
  137.         xn += h;
  138.         concAtual += (d1 / 6) + (d2 / 3) + (d3 / 3) + (d4 / 6);
  139.         file << "[" << minutos << ", " << concAtual << "], ";
  140.     }
  141.     file << "]";
  142.     cout << "Concentracao ao fim de 3 dias: " << concAtual << endl;
  143.     return concAtual;
  144. }
  145.  
  146. double eulerSimples() {
  147.     int minutos = 0; //começa em t = 0
  148.     int nAdministracoes = 1; //começa com a primeira administraçao
  149.     double concAtual = 0; //Inicializar concentraçao
  150.     double h = 1; //Passo: de 1 em 1 minuto
  151.  
  152.     ofstream file;
  153.     file.open("Euler Simples.txt");
  154.  
  155.     cout << "Metodo de Euler Simples" << endl << endl;
  156.     file << "[";
  157.  
  158.     while (nAdministracoes < 6) {
  159.  
  160.         if ((minutos % (60 * 12)) == 0) {
  161.             nAdministracoes++;
  162.         }
  163.         minutos++;
  164.  
  165.         concAtual += h * funcao1(minutos, concAtual);
  166.         file << "[" << minutos << ", " << concAtual << "], ";
  167.     }
  168.     file << "]";
  169.     cout << "Concentracao ao fim de 3 dias: " << concAtual << endl;
  170.     return concAtual;
  171.  
  172. }
  173. void metodoBissecao() {
  174.     // Dados
  175.     double Ket = (0.0959 / 60);
  176.     double Ke = Ket;
  177.     double tMax = 5;
  178.  
  179.     ofstream file;
  180.     file.open("Bissecao.txt");
  181.     // Valores Inicias
  182.     double a, b;
  183.  
  184.     // Valor Medio
  185.     double xn;
  186.  
  187.     // Valor da Funcao
  188.     double fxn, fa, fb;
  189.  
  190.     cout << "Valores Iniciais" << endl;
  191.     cout << "A: ";
  192.     cin >> a;
  193.     cout << "B: ";
  194.     cin >> b;
  195.  
  196.     cout << endl << "A | B | Xn | F(Xn) | F(a) | F(b)" << endl;
  197.  
  198.     file << "[";
  199.  
  200.     double dif;
  201.     do {
  202.         xn = (a + b) / 2;
  203.  
  204.         fa = a * pow(E, -a * tMax) - Ke * pow(E, -Ke * tMax);
  205.         fb = b * pow(E, -b * tMax) - Ke * pow(E, -Ke * tMax);
  206.         fxn = xn * pow(E, -xn * tMax) - Ke * pow(E, -Ke * tMax);
  207.  
  208.         cout << a << " | " << b << " | " << xn << " | " << fxn << " | " << fa
  209.                 << " | " << fb << endl;
  210.  
  211.         file << "[" << xn << ", " << fxn << "], ";
  212.  
  213.         dif = abs(a - xn);
  214.  
  215.         if (abs(fxn) < abs(fa))
  216.             a = xn;
  217.         else
  218.             b = xn;
  219.  
  220.         if (fxn < 0)
  221.             fxn = 0 - fxn;
  222.  
  223.     } while (dif >= 0.0001);
  224.     file << "]";
  225.  
  226.     cout << endl << " XN: " << xn << endl;
  227.     cout << endl << " FXN: " << fxn << endl;
  228.  
  229. }
  230. void metodoCorda() {
  231.     // Dados
  232.     double Ket = (0.0959 / 60);
  233.     double Ke = Ket;
  234.     double tMax = 5;
  235.  
  236.     ofstream file;
  237.     file.open("Corda.txt");
  238.     // Valores Inicias
  239.     double a, b;
  240.  
  241.     // Valor Medio
  242.     double xn;
  243.  
  244.     // Valor da Funcao
  245.     double fxn, fa, fb;
  246.  
  247.     cout << "Valores Iniciais" << endl;
  248.     cout << "A: ";
  249.     cin >> a;
  250.     cout << "B: ";
  251.     cin >> b;
  252.  
  253.     cout << endl << "A | B | Xn | F(Xn) | F(a) | F(b)" << endl;
  254.  
  255.     file << "[";
  256.  
  257.     double dif;
  258.     do {
  259.  
  260.         fa = a * pow(E, -a * tMax) - Ke * pow(E, -Ke * tMax);
  261.         fb = b * pow(E, -b * tMax) - Ke * pow(E, -Ke * tMax);
  262.  
  263.         xn = (a * fb - b * fa) / (fb - fa);
  264.  
  265.         fxn = xn * pow(E, -xn * tMax) - Ke * pow(E, -Ke * tMax);
  266.  
  267.         cout << a << " | " << b << " | " << xn << " | " << fxn << " | " << fa
  268.                 << " | " << fb << endl;
  269.  
  270.         file << "[" << xn << ", " << fxn << "], ";
  271.  
  272.         dif = abs(a - xn);
  273.  
  274.         if (abs(fxn) < abs(fa))
  275.             a = xn;
  276.         else
  277.             b = xn;
  278.  
  279.         if (fxn < 0)
  280.             fxn = 0 - fxn;
  281.  
  282.     } while (dif >= 0.0001);
  283.     file << "]";
  284.  
  285.     cout << endl << " XN: " << xn << endl;
  286.     cout << endl << " FXN: " << fxn << endl;
  287.  
  288. }
  289. void picardPeano() {
  290.     const double KET = 0.0959 / 60;        //min^-1
  291.     //const long double VAP = 3.5;                //L
  292.     const double TMAX = 5;                 //min
  293.     //const long double KE = KET * VAP;           //L^-1*min^-1
  294.     //const long double nep = 2.7182818284590452353602874;
  295.     double Ka;
  296.     double Ka2 = 0.2;              //Guess
  297.     double g;
  298.  
  299.     do {
  300.         Ka = Ka2;
  301.         //g = (KET*exp(-TMAX*KET)) / exp(-Ka*TMAX);
  302.         g = -(log(KET) - KET * TMAX - log(Ka)) / TMAX;
  303.         cout << "Ka= " << Ka << " ; g(Ka)= " << g << endl;
  304.         Ka2 = g;
  305.  
  306.     } while (abs(Ka2 - Ka) > 0.0001);
  307. }
  308.  
  309. double rungeKutta4Sistema() { ///Runge-Kutta 4ªordem
  310.     int minutos = 0; //começa em t = 0
  311.     int nAdministracoes = 0; //começa com a primeira administraçao
  312.     double mi = 0; //Inicializar concentraçao
  313.     double mp = 0;
  314.     double h = 1; //Passo: de 1 em 1 minuto
  315.     double d1, d2, d3, d4;
  316.     double l1, l2, l3, l4;
  317.  
  318.     ofstream file1;
  319.     ofstream file2;
  320.     ofstream file3;
  321.     file1.open("Runge-Kutta4 Mi.txt");
  322.     file2.open("Runge-Kutta4 Mp.txt");
  323.     file3.open("Runge-kutta4 conc.txt");
  324.     cout << "Metodo de Runge-Kutta 4 ordem para sistemas de equações lineares"
  325.             << endl << endl;
  326.     file1 << "[";
  327.     file2 << "[";
  328.     file3 << "[";
  329.  
  330.     while (nAdministracoes < 6) {
  331.         if ((minutos % (60 * 12)) == 0) {
  332.             nAdministracoes++;
  333.         }
  334.         minutos++;
  335.         d1 = h * funcaoMi(minutos, mi);
  336.         d2 = h * funcaoMi(minutos + (h / 2), mi + (d1 / 2));
  337.         d3 = h * funcaoMi(minutos + (h / 2), mi + (d2 / 2));
  338.         d4 = h * funcaoMi(minutos + h, mi + d3);
  339.  
  340.         l1 = h * funcaoMp(minutos, mi, mp);
  341.         l2 = h * funcaoMp(minutos + (h / 2), mi + (d1 / 2), mp + (l1 / 2));
  342.         l3 = h * funcaoMp(minutos + (h / 2), mi + (d2 / 2), mp + (l2 / 2));
  343.         l4 = h * funcaoMp(minutos + h, mi + d3, mp + l3);
  344.  
  345.         mi += (d1 / 6) + (d2 / 3) + (d3 / 3) + (d4 / 6);
  346.         mp += (l1 / 6) + (l2 / 3) + (l3 / 3) + (l4 / 6);
  347.  
  348.         file1 << "[" << minutos << ", " << mi << "], ";
  349.         file2 << "[" << minutos << ", " << mp << "], ";
  350.  
  351.         cout << "t= " << minutos << " ;mi= " << mi << " ;mp= " << mp << endl;
  352.         file2 << "[" << minutos << ", " << mp << "], ";
  353.         file1 << "[" << minutos << ", " << mi << "], ";
  354.         file3 << "[" << minutos << ", " << (mp / volumePlasma) << "], ";
  355.     }
  356.     file1 << "]";
  357.     file2 << "]";
  358.     file3 << "]";
  359.     return 0;
  360. }
  361.  
  362. double funcao1(int minutos, double concAtual) {
  363.     int dt = 0;
  364.     if ((minutos % (60 * 12)) == 0)
  365.         dt = 250;
  366.     if (minutos == 0)
  367.         dt = 250;
  368.     return (dt - (ket * concAtual)) / volumePlasma;
  369. }
  370.  
  371. double funcaoMi(int minutos, double mi) {
  372.     int dt = 0;
  373.     if ((minutos % (60 * 12)) == 0)
  374.         dt = 250;
  375.  
  376.     if (minutos == 0)
  377.         dt = 250;
  378.  
  379.     return (dt - (Ka * mi));
  380. }
  381.  
  382. double funcaoMp(int minutos, double mi, double mp) {
  383.     return (Ka * mi - KET * mp);
  384. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement