Pesquisar neste blog

23/02/2018

Algoritmo Método da Bissecção C/C++

Em engenharia elétrica geralmente usam-se a leis de Kirchhoff para estudar o comportamento estacionário (que não varia com o tempo ) de circuitos elétricos. Um outro problema importante envolve os circuitos que são transientes por natureza e em que ocorrem variações temporais súbitas. Tal situação ocorre depois do fechamento da chave da figura abaixo.









A duração desse período está intimamente ligada às propriedades de armazenamento do capacitor e do indutor. O fluxo da corrente através do resistor causa uma queda de voltagem (VR) dada por:

VR = iR

Onde i é a corrente e R é a resistência do resistor.
Um indutor “resiste” a variações na corrente, de modo que a queda de tensão VL através dele é:





A queda de tensão no capacitor VC depende da carga (q) nele:

Onde C é a capacitância.



A segunda lei de Kirchhoff afirma que a soma algébrica das quedas de voltagem em torno de um circuito fechado é zero. Depois que a chave é fechada, tem-se:





Entretanto, a corrente está relacionada com a carga por:





Portanto,


Trata-se de uma equação diferencial ordinária linear de segunda ordem. A solução é dada por:






Na qual t = 0, q = q0 =V0C e V é voltagem fornecida pela bateria. A equação (1) descreve a variação no tempo na carga do capacitor.

Um problema de projeto típico em engenharia ( elétrica, controle, computação) poderia envolver a determinação do resistor apropriado para dissipar energia a uma taxa específica , com valores conhecidos para L e C. Para esse Problema, suponha que a carga deve ser dissipada a 1% do seu valor original (q/q0 = 0,01) em t=0,05s, com L = 5 H e C = 10-3 F

PS: Use o método da Bissecção. O método de Newton-Raphson pode ser inconveniente em virtude do cálculo da derivada de (1) ser trabalhoso.

A variável implícita da equação é R.


Resolução:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

main(){

    int opcao = 0 ,k =0 ;
    float x = 0, y = 0, p = 0, M = 0, Fy = 0, Fyy = 0, Fm = 0, aux =0 , aux1=0 , er = 0, e =0.;

opcao = 0;

while(opcao != 2){

printf("\n\n\t\t");
printf("************\n \n \t");
printf("MENU DE OPCOES");
printf("\n\n\t");
printf("1 - Inserir Chute para o metodo.");
printf("\n\n\t");
printf("2 - Sair");
printf("\n\n\t");
printf("Escolha Opcao: ");
scanf("%d", &opcao);

switch(opcao){

case 1:{
                    printf("\n\n\t\t");
                    printf("************\n \n \t");
                    printf( "Digite valor de A:" );
                    scanf( "%f", &x );
                    printf("\n\n\t");
                    printf( "Digite valor de B:" );
                    scanf( "%f", &y );
                    printf("\n\n\t");
                    printf( "Digite a precisao desejada:" );
                    scanf( "%f", &p );
                    printf("\n");
                    k=0;

                do{

                    M = ( x + y ) / 2;
                    Fy =  (pow(M_E,-0.005*x)*cos(sqrt(2000-0.01*pow(x,2))*(0.05)))-0.01;
                    Fm = (pow(M_E,-0.005*M)*cos(sqrt(2000-0.01*pow(M,2))*(0.05))) -0.01;
                    Fyy =  (pow(M_E,-0.005*y)*cos(sqrt(2000-0.01*pow(y,2))*(0.05)))-0.01;

                    aux = Fy*Fm ;
                    aux1 = Fyy*Fm ;

                    if ( aux < 0 ){
                        y = M;
                    }
                    else if ( aux1 < 0){
                        x = M;
                    }
                    if (x > 447 || y > 447)
                        break;
                    if (  aux > 0 && aux1 > 0 ){
                        printf("\n\n\t");
                        printf(" Entre as variaveis A e B não possuem raizes  .");
                        break ;
                    }

                    k++;
                    printf("\n\n\t");
                    printf( "iteracao = %d\n", k );
                    printf( "A = %.20f\nB = %.20f\n", x, y );

                } while( y - x >= p || Fy >= p || Fyy >= p  );
                    er = y - x ;
                    e = (y+x)/2;
                    if (er < 0)
                        er = er*-1;

                    printf("\nO erro e  = %.20f\n", er);
                    printf( "A valor de R e: %.20f\n", e );

break;
}
            case 2:{

                printf("\n\n\t");
                printf("Voce SAIU com SUCESSO");
                printf("\n\n");

break;
}

default:{

printf("\n\n\t");
printf("Opcao INVALIDA");
printf("\n\n");

}
}
}

}

Um comentário:

Anônimo disse...

Quais seria as raízes?