Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <conio.h>
- #include <time.h>
- #define NTESTE 10
- double f(double a0,double a1,double a2,double a3,double a4,double a5,double x)
- {
- return a0*cos(a1*x) + a2*sin(a3*x) + exp(a4*x) + a5;
- }
- double d1(double a0,double a1,double a2,double a3,double a4,double x)
- {
- return -a0*a1*sin(a1*x) + a2*a3*cos(a3*x) + a4*exp(a4*x);
- }
- double d2(double a0,double a1,double a2,double a3,double a4,double x)
- {
- return -a0*a1*a1*cos(a1*x) - a2*a3*a3*sin(a3*x) + a4*a4*exp(a4*x);
- }
- int NewtonRaphson(int N,double a,double b,double e1,double e2,double a0,double a1,double a2,double a3,double a4,double a5)
- {
- double erro1 = 1.,erro2 = 0., fx, der, fa, fb;
- double *xi;
- int i = 0;
- FILE *fp;
- clock_t tin, tf, diff;
- tin = clock()/(CLOCKS_PER_SEC/1000);
- xi = (double*)malloc(N*sizeof(double));
- fp = fopen("resultados.txt","a");
- xi[0] = (a+b)/2;
- erro2 = f(a0,a1,a2,a3,a4,a5,xi[0]);
- if(erro2 < 0)
- erro2 = -erro2;
- while(erro1 > e1 && erro2 > e2)
- {
- if(i > N)
- {
- printf("O método não convergiu em %d iteracoes!\n",N);
- return 1;
- }
- //Teorema de Bolzano
- fa = f(a0,a1,a2,a3,a4,a5,a);
- fb = f(a0,a1,a2,a3,a4,a5,b);
- if(fa*fb > 0)
- {
- printf("Pelo Teorema de Bolzano, o intervalo nao eh de separacao, entao nao ha raiz \nnesse intervalo!\n");
- break;
- }
- fx = f(a0,a1,a2,a3,a4,a5,xi[i]);
- der = d1(a0,a1,a2,a3,a4,xi[i]);
- if(der == 0)
- {
- printf("A derivida eh zero! O processo nao pode continuar!\n\n");
- break;
- }
- xi[i+1] = xi[i] - fx/der;
- erro1 = xi[i+1] - xi[i];
- if(erro1 < 0)
- erro1 = -erro1;
- erro2 = f(a0,a1,a2,a3,a4,a5,xi[i+1]);
- if(erro2 < 0)
- erro2 = -erro2;
- i++;
- printf("Iteracao: %d\n",i);
- printf("Raiz aproximada: %.5f\n",xi[i]);
- printf("Erro 1: |x[i+1] - x[i]| = %.5f\n",erro1);
- printf("Erro 2: |f(x[i])| = %.5f\n\n",erro2);
- }
- tf = clock()/(CLOCKS_PER_SEC/1000);
- diff = tf - tin;
- printf("Tempo de Execucao Newton: %d ms\n",(int)diff);
- // Salvar no arquivo texto
- fprintf(fp,"Newton\n");
- if(fa*fb > 0 || der == 0)
- fprintf(fp,"Nao convergiu\n\n");
- else
- {
- fprintf(fp,"Convergiu\n");
- fprintf(fp,"Iteracao: %d\n",i);
- fprintf(fp,"Raiz: %.5lf\n",xi[i]);
- fprintf(fp,"Erro 1: %.5lf\n",erro1);
- fprintf(fp,"Erro 2: %.5lf\n\n",erro2);
- }
- fclose(fp);
- free(xi);
- return 0;
- }
- int Halley(int N,double a,double b,double e1,double e2,double a0,double a1,double a2,double a3,double a4,double a5)
- {
- double erro1 = 1., erro2 = 0., fx, der1, der2, fa, fb;
- double *xi;
- int i = 0;
- FILE *fp;
- clock_t tin, tf, diff;
- tin = clock()/(CLOCKS_PER_SEC/1000);
- xi = (double*)malloc(N*sizeof(double));
- fp = fopen("resultados.txt","a");
- xi[0] = (a+b)/2;
- erro2 = f(a0,a1,a2,a3,a4,a5,xi[0]);
- if(erro2 < 0)
- erro2 = -erro2;
- while(erro1 > e1 && erro2 > e2)
- {
- if(i > N)
- {
- printf("O metodo nao convergiu em %d iteracoes!\n",N);
- return 2;
- }
- //Teorema de Bolzano
- fa = f(a0,a1,a2,a3,a4,a5,a);
- fb = f(a0,a1,a2,a3,a4,a5,b);
- if(fa*fb > 0)
- {
- printf("Pelo Teorema de Bolzano, o intervalo nao eh de separacao, entao nao ha raiz \nnesse intervalo!\n");
- break;
- }
- fx = f(a0,a1,a2,a3,a4,a5,xi[i]);
- der1 = d1(a0,a1,a2,a3,a4,xi[i]);
- der2 = d2(a0,a1,a2,a3,a4,xi[i]);
- if(der1 == 0 && der2 == 0)
- {
- printf("As derividas sao zero! O processo nao pode continuar!\n\n");
- break;
- }
- xi[i+1] = xi[i] - (2*fx*der1)/(2*der1*der1 - fx*der2);
- erro1 = xi[i+1] - xi[i];
- if(erro1 < 0)
- erro1 = -erro1;
- erro2 = f(a0,a1,a2,a3,a4,a5,xi[i+1]);
- if(erro2 < 0)
- erro2 = -erro2;
- i++;
- printf("Iteracao: %d\n",i);
- printf("Raiz aproximada: %.5f\n",xi[i]);
- printf("Erro 1: |x[i+1] - x[i]| = %.5f\n",erro1);
- printf("Erro 2: |f(x[i])| = %.5f\n\n",erro2);
- }
- tf = clock()/(CLOCKS_PER_SEC/1000);
- diff = tf - tin;
- printf("Tempo de Execucao: %d ms\n",(int)diff);
- // Salvar no arquivo texto
- fprintf(fp,"Halley\n");
- if(fa*fb > 0 || (der1 == 0 && der2 == 0))
- fprintf(fp,"Nao convergiu\n\n");
- else
- {
- fprintf(fp,"Convergiu\n");
- fprintf(fp,"Iteracao: %d\n",i);
- fprintf(fp,"Raiz: %.5lf\n",xi[i]);
- fprintf(fp,"Erro 1: %.5lf\n",erro1);
- fprintf(fp,"Erro 2: %.5lf\n\n",erro2);
- }
- fclose(fp);
- free(xi);
- return 0;
- }
- int Bissecao(int N,double a,double b,double e1,double e2,double a0,double a1,double a2,double a3,double a4,double a5)
- {
- double erro1 = 1., erro2 = 0., fa, fb, fxi;
- double *xi;
- int i = 0;
- FILE *fp;
- time_t tin, tf, diff;
- tin = clock()/(CLOCKS_PER_SEC/1000);
- xi = (double*)malloc(N*sizeof(double));
- fp = fopen("resultados.txt","a");
- xi[0] = (a+b)/2;
- erro2 = f(a0,a1,a2,a3,a4,a5,xi[0]);
- if(erro2 < 0)
- erro2 = -erro2;
- while(erro1 > e1 && erro2 > e2)
- {
- if(i > N)
- break;
- fa = f(a0,a1,a2,a3,a4,a5,a);
- fb = f(a0,a1,a2,a3,a4,a5,b);
- fxi = f(a0,a1,a2,a3,a4,a5,xi[i]);
- //Teorema de Bolzano
- if(fa*fb > 0)
- {
- printf("Pelo Teorema de Bolzano, o intervalo nao eh de separacao, entao nao ha raiz \nnesse intervalo!\n");
- break;
- }
- if(fa*fxi < 0)
- b = xi[i];
- if(fb*fxi < 0)
- a = xi[i];
- xi[i+1] = (a+b)/2;
- erro1 = xi[i+1] - xi[i];
- if(erro1 < 0)
- erro1 = -erro1;
- erro2 = f(a0,a1,a2,a3,a4,a5,xi[i+1]);
- if(erro2 < 0)
- erro2 = -erro2;
- i++;
- printf("Iteracao: %d\n",i);
- printf("Raiz aproximada: %.5f\n",xi[i]);
- printf("Erro 1: |x[i+1] - x[i]| = %.5f\n",erro1);
- printf("Erro 2: |f(x[i])| = %.5f\n\n",erro2);
- }
- tf = clock()/(CLOCKS_PER_SEC/1000);
- diff = tf - tin;
- printf("Tempo de Execucao: %d ms\n",(int)diff);
- // Salvar no arquivo texto
- fprintf(fp,"Bissecao\n");
- if(fa*fb > 0 || i > N)
- fprintf(fp,"Nao convergiu");
- else
- {
- fprintf(fp,"Convergiu\n");
- fprintf(fp,"Iteracao: %d\n",i);
- fprintf(fp,"Raiz: %.5lf\n",xi[i]);
- fprintf(fp,"Erro 1: %.5lf\n",erro1);
- fprintf(fp,"Erro 2: %.5lf\n\n",erro2);
- }
- fclose(fp);
- free(xi);
- return 0;
- }
- void calculoArqtext()
- {
- double a0, a1, a2, a3, a4, a5;
- double e1, e2;
- double a, b;
- int N, j = 0;
- char inicio;
- FILE *fp,*p;
- fp = fopen("testes.txt","r");
- p = fopen("resultados.txt","w");
- fclose(p);
- for(j = 0;j < NTESTE;j++)
- {
- if(fp == NULL)
- {
- printf("Impossível abrir o arquivo!\n");
- exit(3);
- }
- else
- {
- printf("\t\tTESTE %d\n\n",j+1);
- fscanf(fp,"%lf",&a0);
- printf("a0: %.5lf\n",a0);
- fscanf(fp,"%lf",&a1);
- printf("a1: %.5lf\n",a1);
- fscanf(fp,"%lf",&a2);
- printf("a2: %.5lf\n",a2);
- fscanf(fp,"%lf",&a3);
- printf("a3: %.5lf\n",a3);
- fscanf(fp,"%lf",&a4);
- printf("a4: %.5lf\n",a4);
- fscanf(fp,"%lf",&a5);
- printf("a5: %.5lf\n",a5);
- fscanf(fp,"%d",&N);
- printf("N: %d\n",N);
- fscanf(fp,"%lf",&e1);
- printf("e1: %.5lf\n",e1);
- fscanf(fp,"%lf",&e2);
- printf("e2: %.5lf\n",e2);
- fscanf(fp,"%lf",&a);
- printf("a: %.5lf\n",a);
- fscanf(fp,"%lf",&b);
- printf("b: %.5lf\n\n",b);
- printf("Iniciar?\n");
- fflush(stdin);
- scanf("%c",&inicio);
- printf("----------------------------------------\n\n");
- printf("\t\t1 - Método de Newton-Raphson\n\n");
- NewtonRaphson(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
- printf("----------------------------------------\n\n");
- getch();
- printf("----------------------------------------\n\n");
- printf("\t\t2 - Método de Halley\n\n");
- Halley(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
- printf("----------------------------------------\n\n");
- getch();
- printf("----------------------------------------\n\n");
- printf("\t\t3 - Método da Bissecao\n\n");
- Bissecao(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
- printf("----------------------------------------\n\n");
- getch();
- }
- }
- fclose(fp);
- }
- void calculoUsuario()
- {
- double a0, a1, a2, a3, a4, a5;
- double e1, e2;
- double a, b;
- int N;
- char inicio;
- FILE *p;
- //Limpar o arquivo
- p = fopen("resultados.txt","w");
- fclose(p);
- //Coeficientes
- printf("Entre os coeficientes:\na0: ");
- fflush(stdin);
- scanf("%lf",&a0);
- printf("a1: ");
- fflush(stdin);
- scanf("%lf",&a1);
- printf("a2: ");
- fflush(stdin);
- scanf("%lf",&a2);
- printf("a3: ");
- fflush(stdin);
- scanf("%lf",&a3);
- printf("a4: ");
- fflush(stdin);
- scanf("%lf",&a4);
- printf("a5: ");
- fflush(stdin);
- scanf("%lf",&a5);
- // Intervalo de Separação
- printf("Qual o intervalo de separacao?\na: ");
- fflush(stdin);
- scanf("%lf",&a);
- printf("b: ");
- fflush(stdin);
- scanf("%lf",&b);
- //Erros
- printf("Qual o erro 1: |x[i+1] - x[i]|? \n");
- fflush(stdin);
- scanf("%lf",&e1);
- printf("Qual o erro 2: |f(x[i])|? \n");
- fflush(stdin);
- scanf("%lf",&e2);
- //Número Máximo de Iterações
- printf("Qual o numero maximo de iteracoes?\n");
- fflush(stdin);
- scanf("%d",&N);
- printf("Iniciar?\n");
- fflush(stdin);
- scanf("%c",&inicio);
- printf("----------------------------------------\n\n");
- printf("\t\t1 - Método de Newton-Raphson\n\n");
- NewtonRaphson(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
- printf("----------------------------------------\n\n");
- getch();
- printf("----------------------------------------\n\n");
- printf("\t\t2 - Método de Halley\n\n");
- Halley(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
- printf("----------------------------------------\n\n");
- getch();
- printf("----------------------------------------\n\n");
- printf("\t\t3 - Método da Bissecao\n\n");
- Bissecao(N,a,b,e1,e2,a0,a1,a2,a3,a4,a5);
- printf("----------------------------------------\n\n");
- getch();
- }
- int main()
- {
- int opcao;
- printf("Este eh um programa para calcular raizes da funcao\n\n\ta0cos(a1*x) + a2sen(a3*x) + e^(a4*x) + a5\n\n");
- while(1)
- {
- printf("Menu:\n1-Entrada do usuario\n2-Testes com arquivo texto\n3-Finalizar programa\n\n");
- printf("Escolha uma opcao: ");
- scanf("%d",&opcao);
- switch(opcao)
- {
- case 1:
- calculoUsuario();
- break;
- case 2:
- calculoArqtext();
- break;
- case 3:
- printf("Muito obrigado por usar o programa!\n\n");
- getch();
- exit(1);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement