Skip to content
Snippets Groups Projects
Commit 27693402 authored by Vytor Calixto's avatar Vytor Calixto :space_invader:
Browse files

Métodos numéricos num header

parent 97bb1d28
No related branches found
No related tags found
No related merge requests found
ex*
!ex*.c
*.o
*.swp
#include <stdio.h>
#include <stdlib.h>
double px(double *p, int n, double x) {
double px = p[n];
for(int i = n-1; i >= 0; --i) {
px = p[i] + px*x;
}
return px;
}
void pxDpx(double *p, int n, double x, double *px, double *dpx) {
double b = p[n], c = p[n];
for(int i = n-1; i > 0; --i) {
b = p[i] + b*x;
c = b + c*x;
}
b = p[0] + b*x;
*px = b;
*dpx = c
}
/**
* Calcula o valor de x dado um polinômio p de grau n
*/
double px(double *p, int n, double x);
/**
* Calcula o valor de x dado um polinômio p de grau n e sua derivada no ponto
*/
void pxDpx(double *p, int n, double x, double *px, double *dpx);
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "libPolinomios.h"
int bissecao(double *p, int n, double *x, double a, double b, double erroMax) {
double fa, fb, fx, erro, xVelho;
fa = px(p, n, a);
fb = px(p, n, b);
do {
xVelho = *x;
*x = (a+b)/2;
fx = px(p, n, *x);
if((fa * fx) < 0) {
b = *x;
} else {
a = *x;
}
erro = fabs(*x - xVelho);
} while((fa * fb) != 0.0f && erro > erroMax);
return 1;
}
int newtonRaphson(double *p, int n, double *x, double erroMax) {
double px, dpx, erro, xNovo;
do {
pxDpx(p, n, *x, &px, &dpx);
if(dpx == 0.0f) return -1;
xNovo = *x - px/dpx;
erro = fabs(xNovo - *x);
*x = xNovo;
} while(erro > erroMax);
return 0;
}
int secante(double *p, int n, double *x, double x0, double erroMax) {
double pk, pxk, xNovo, erro;
do {
pk = px(p, n, *x);
pxk = px(p, n, x0);
xNovo = *x - (pk * (*x - x0)) / (pk - pxk);
erro = fabs(xNovo - *x);
*x = xNovo;
} while(erro > erroMax);
return 0;
}
/**
* Método da bisseção
* Calcula o zero de função de um polinômio p de grau n buscando no intervalo (a,b)
* parando quando o erro for menor do que erroMax
*/
int bissecao(double *p, int n, double *x, double a, double b, double erroMax);
/**
* Método de Newton-Raphson
* Calcula o zero de função usando como função de iteração i(x) = x - f(x)/f'(x)
*/
int newtonRaphson(double *p, int n, double *x, double erroMax);
/**
* Método da Secante
* Calcula o zero de função trocando a derivada do método de Newton por diferenças finitas
*/
int secante(double *p, int n, double *x, double x0, double erroMax);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment