Skip to content

Instantly share code, notes, and snippets.

@Alexsandr0x
Last active October 9, 2016 19:02
Show Gist options
  • Save Alexsandr0x/54f01e0effd42a5c85fb388aa332146d to your computer and use it in GitHub Desktop.
Save Alexsandr0x/54f01e0effd42a5c85fb388aa332146d to your computer and use it in GitHub Desktop.
exec1 - bisectionMethod

Exercicio 1: metodo bisecante

  • Code:
/*
Para o Dioxido de Carbono (CO2), a equacao de estado de um gas tem os seguintes
coeficientes:
a = 0.401, b = 42.7*10^-6

determine o valor ocupado por 1000 moleculas deste gas, a temperatura de 300K
e pressao de 3.5*10^7 pelo metodo da bissecao, com uma tolerancia de 10^-12.

constante de boltzmann eh k = 1.3806503*10^-23

[p + a(N/V)^2]*(V - Nb) = kNT
*/

float a = 0.401;

float b = 42.7*pow(10,-6);

float p = 3.5*pow(10, 7);

float k = 1.3806503*pow(10, -23);

float tolerance = pow(10, -12);

float T = 300;

float N = 1000;

// float V = ?
 
float f (float V)
{
    float fx1;
    fx1 = (p + a*pow((N/V), 2))*(V - N*b) - k*N*T;
    return (fx1);
}

using namespace std;

int main()
{
    float x3;
    // Baseado na plotagem dessa funcao, percebemos que ela nao eh definida em 0
    float x1 = 0.0001;
    float x2 = 100;
    int count = 0;
    int iter = 40;
    cout << "metodo bisecante no intervalo [" << x1 << ", " << x2 << "]" << endl;
    do
    {
        if (count == iter){
            break;
        }
        count++;
        x3 = (x1 + x2)/2;
        if( f(x1) * f(x3) < 0 )
        {
            x2 = x3;
        }
        else
        {
            x1 = x3;
        }
    }
    while (abs(x1 - x2) > tolerance || f(x3) == 0 );
    
    
    cout << "interacoes: " << count << endl;  
    cout << "saida: " << x1 << endl;  
}
  • Output:
metodo bisecante no intervalo [0.0001, 100]
interacoes: 40
saida: 0.0427

Exercicio 1: metodo valor falso

  • Code:
#include<iostream>
#include<cmath>

/*
Para o Dioxido de Carbono (CO2), a equacao de estado de um gas tem os seguintes
coeficientes:
a = 0.401, b = 42.7*10^-6

determine o valor ocupado por 1000 moleculas deste gas, a temperatura de 300K
e pressao de 3.5*10^7 pelo metodo da bissecao, com uma tolerancia de 10^-12.

constante de boltzmann eh k = 1.3806503*10^-23

[p + a(N/V)^2]*(V - Nb) = kNT
*/

float a = 0.401;

float b = 42.7*pow(10,-6);

float p = 3.5*pow(10, 7);

float k = 1.3806503*pow(10, -23);

float tolerance = pow(10, -12);

float T = 300;

float N = 1000;

// float V = ?
 
float f (float V)
{
    float fx1;
    fx1 = (p + a*pow((N/V), 2))*(V - N*b) - k*N*T;
    return (fx1);
}

using namespace std;

int main() {  
      
    float a = 10;  
    float b = 0.001;  
      
    float c = 0;  
    float c0 = b;  
    float output = 0;  
    float e = 1e-12;
    float iter = 20000;
      
    unsigned int i = 0;  
    while (i < iter) {  
        c = a - ((b - a)/(f(b) - f(a)))*(f(a));
        i++;
        
        if (abs(c - c0) < e * abs(c)) {  
            break;  
        } else {  
            c0 = c;  
            if (f(a)*f(c) > 0)  
                a = c;  
            else   
                b = c;  
        }  
    }  
    output = c;
    cout << "interacoes: " << i << endl;  
    cout << "saida: " << output << endl;  
      
    return 0;  
} 
  • Output:
interacoes: 20000
saida: 0.0427066

Exercicio 1: metodo de newton

  • Code:
#include<iostream>
#include<stdio.h>
#include<math.h>
/*
Para o Dioxido de Carbono (CO2), a equacao de estado de um gas tem os seguintes
coeficientes:
a = 0.401, b = 42.7*10^-6

determine o valor ocupado por 1000 moleculas deste gas, a temperatura de 300K
e pressao de 3.5*10^7 pelo metodo da bissecao, com uma tolerancia de 10^-12.

constante de boltzmann eh k = 1.3806503*10^-23

[p + a(N/V)^2]*(V - Nb) = kNT
*/

float a = 0.401;

float b = 42.7*pow(10,-6);

float p = 3.5*pow(10, 7);

float k = 1.3806503*pow(10, -23);

float tolerance = pow(10, -12);

float T = 300;

float N = 1000;

float f (float V)
{
    float fx1;
    fx1 = (p + a*pow((N/V), 2))*(V - N*b) - k*N*T;
    return (fx1);
}

float df (float V)
{
    float fx1;
    fx1 = -2*a*pow(N, 2)*(V - b*N)/pow(V, 3) + (a*pow(N, 2)/pow(V, 2)) - k*T + p;
    return (fx1);
}

using namespace std;

int main()
{
    int itr, maxmitr;
    float h, x0, x1, allerr;
    x0 = 1;
    allerr = tolerance;
    maxmitr = 45;
    
    for (itr=1; itr<=maxmitr; itr++)
    {
        h=f(x0)/df(x0);
        x1=x0-h;
        if (fabs(h) < allerr)
        {
            break;
        }
        x0=x1;
    }
    cout << "interacoes: " << itr << endl;  
    cout << "saida: " << x1 << endl; 
}
  • Output:
interacoes: 8
saida: 0.0427
  • Code:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <limits>
#include <cmath>

float E = 0;

using namespace std;

float f (float x)
{
    float fx1;
    fx1 = -1/pow(x, 3) - 1/pow(x, 2) - E;
    return (fx1);
}

float df (float x)
{
    float fx1;
    fx1 = (2*x + 3)/pow(x, 4);
    return (fx1);
}

void falseMethod(float i_range, float e_range) {
    cout << "metodo falso valor no intervalo [" << i_range << ", " << e_range << "]" << endl;
    
    float a = e_range;  
    float b = i_range;
    float output = 0;
    float c = 0;
    float c0 = b;
    int i = 0;  
    while (true) {  
        c = a - ((b - a)/(f(b) - f(a)))*(f(a));
        i++;
        if (abs(c - c0) < numeric_limits<float>::epsilon()*fmax(1.0, abs(c))) {  
            output = c;  
            break;  
        } else {  
            c0 = c;  
            if (f(a)*f(c) > 0)  
                a = c;  
            else   
                b = c;  
        }  
    }  
      
    cout << "interacoes: " << i << endl;  
    cout << "saida: " << c << endl;  
}

void bisectionMethod(float i_range, float e_range) {
    cout << "metodo bisecante no intervalo [" << i_range << ", " << e_range << "]" << endl;
    int count = 0;
    float x3 = 0;
    float x1 = i_range;
    float x2 = e_range;
    do
    {
        count++;
        
        x3 = (x1 + x2)/2;
 
        if( f(x1) * f(x3) < 0 )
        {
            x2 = x3;
        }
        else
        {
            x1 = x3;
        }
    }
    while (abs(x1 - x2) > numeric_limits<float>::epsilon()*fmax(1.0, abs(x3)) || f(x3) == 0);
    
    cout << "interacoes: " << count << endl;  
    cout << "saida: " << x3 << endl;  
}

void newtonMethod(float init_value) {
    cout << "metodo newton no ponto [" << init_value << "]" << endl;
    float x0 = init_value;
    float h, x1;
    int count = 0;
    while(true) {
        count++;
        float allerr = numeric_limits<float>::epsilon()*fmax(1.0, abs(x1));
        h=f(x0)/df(x0);
        x1=x0-h;
        if (fabs(h) < allerr)
        {
            break;
        }
        x0=x1;
    }
    cout << "interacoes: " << count << endl;  
    cout << "saida: " << x1 << endl;  
}

int main() {
    for (int i=3;i<=5;i++){
        cout << "iteracao para E = -" << i <<endl;
        E = -i;
        falseMethod(0.01, 1);
        cout << endl;
        bisectionMethod(0.01, 1);
        cout << endl;
        newtonMethod(1.0);
        cout << "-----------------------------------" << endl;
        cout << endl;
    }
}
  • Output:
iteracao para E = -3
metodo falso valor no intervalo [0.01, 1]
interacoes: 350406
saida: 0.863511

metodo bisecante no intervalo [0.01, 1]
interacoes: 23
saida: 0.851383

metodo newton no ponto [1]
interacoes: 5
saida: 0.851383
-----------------------------------

iteracao para E = -4
metodo falso valor no intervalo [0.01, 1]
interacoes: 348222
saida: 0.769684

metodo bisecante no intervalo [0.01, 1]
interacoes: 23
saida: 0.76069

metodo newton no ponto [1]
interacoes: 6
saida: 0.76069
-----------------------------------

iteracao para E = -5
metodo falso valor no intervalo [0.01, 1]
interacoes: 320419
saida: 0.704765

metodo bisecante no intervalo [0.01, 1]
interacoes: 23
saida: 0.697628

metodo newton no ponto [1]
interacoes: 8
saida: 0.697628
-----------------------------------
  • Code:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <limits>
#include <cmath>
#include <math.h>

using namespace std;

float a = 10;
float b = 8;
float y = 3*M_PI/5;
float eps = numeric_limits<float>::epsilon();

float f (float x)
{
    float fx1;
    fx1 = (a*(cos(M_PI - y - x)/pow(sin(M_PI - y - x), 2)) - b*(cos(x)/pow(sin(x), 2)));
    return fx1;
}

float df (float x)
{
    float fx1;
    fx1 = (f(x + eps) - f(x - eps)) / (2*eps);
    return (fx1);
}

void bisectionMethod(float i_range, float e_range) {
    cout << "metodo bisecante no intervalo [" << i_range << ", " << e_range << "]" << endl;
    int count = 0;
    float x3 = 0;
    float x1 = i_range;
    float x2 = e_range;
    do
    {
        count++;
        
        x3 = (x1 + x2)/2;
 
        if( f(x1) * f(x3) < 0 )
        {
            x2 = x3;
        }
        else
        {
            x1 = x3;
        }
    }
    while (abs(x1 - x2) > numeric_limits<float>::epsilon()*fmax(1.0, abs(x3)) || f(x3) == 0);
    
    cout << "interacoes: " << count << endl;  
    cout << "saida: " << x3 << endl;  
}

void newtonMethod(float init_value) {
    cout.precision(8);
    cout << "metodo newton no ponto [" << init_value << "]" << endl;
    float x0 = init_value;
    float h, x1;
    int count = 0;
    while(true) {
        count++;
        float allerr = numeric_limits<float>::epsilon()*fmax(1.0, abs(x1));
        h=f(x0)/df(x0);
        x1=x0-h;
        if (fabs(h) < allerr)
        {
            break;
        }
        x0=x1;
    }
    cout << "interacoes: " << count << endl;  
    cout << "saida: " << x1 << endl;  
}

int main(){
    newtonMethod(1.0);
    bisectionMethod(0.01, 1);
}
  • Output:
metodo newton no ponto [1]
interacoes: 7
saida: 0.59627986
metodo bisecante no intervalo [0.0099999998, 1]
interacoes: 23
saida: 0.59627998
  • Code:
#include <iostream>
#include <algorithm>
#include <limits>

float a = 25;

using namespace std;

void sqrtSum(float a){
    float k = 1;
    for (int i = 0; i <= 10; i++){
        k = k*(pow(k, 2) + 3*a)/(3*pow((k), 2) + a);
    }
    cout << "valor apos 10 iteracoes para " << a << ": " << k << endl;
}

int main(){
    cout.precision(8);
    for (int i = 1; i <= 20; i++){
        sqrtSum(i);
    }
}
  • Output:
valor apos 10 iteracoes para 1: 1
valor apos 10 iteracoes para 2: 1.4142135
valor apos 10 iteracoes para 3: 1.7320508
valor apos 10 iteracoes para 4: 2
valor apos 10 iteracoes para 5: 2.236068
valor apos 10 iteracoes para 6: 2.4494898
valor apos 10 iteracoes para 7: 2.6457512
valor apos 10 iteracoes para 8: 2.8284271
valor apos 10 iteracoes para 9: 3
valor apos 10 iteracoes para 10: 3.1622777
valor apos 10 iteracoes para 11: 3.3166249
valor apos 10 iteracoes para 12: 3.4641016
valor apos 10 iteracoes para 13: 3.6055512
valor apos 10 iteracoes para 14: 3.7416575
valor apos 10 iteracoes para 15: 3.8729835
valor apos 10 iteracoes para 16: 4
valor apos 10 iteracoes para 17: 4.1231055
valor apos 10 iteracoes para 18: 4.2426405
valor apos 10 iteracoes para 19: 4.3588991
valor apos 10 iteracoes para 20: 4.472136
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment