Hola, buenas. Tengo un código que se basa en el algoritmo de bisección el cual encuentra una raíz de una función dada, en mi caso usé "x^3 + 2x^2 + x - 2"
pero quisiera saber cómo puedo hacer que el usuario elija qué tipo de función usar para la aproximación?, osea, que sean 4 las opciones:
Polinomial: f(x) = a0 + a1 x + a2 x2 + ... + an xn
Exponencial: f(x) = a e (k x + c) + b
Logaritmica: f(x) = a Ω(k x + c) + b Ω = log, ln
Trigonométrica: f(x) = a Ω(k x + c) + b Ω = sen, cos, etc
mi código es el siguiente, sencillo pero útil:
Código:
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <iomanip>
//******************************************************************************
using namespace std;
void bisetzion(long double,long double,int);
long double f(long double);
void impresion(long double,long double,long double,long double,int);
long double Abs(long double);
//******************************************************************************
int main(){
long double an,bn,pn,tol;
int n;
char resp;
do{
system("cls");
cout<<"Programa que utiliza el proceso de bisecci\xA2n para aproximar la funci\xA2n \nx^3 + 2x^2 + x - 2\n\n";
do{
cout<<"introduzca la an: ";
cin>>an;
cout<<"introduzca la bn: ";
cin>>bn;
}while(f(an)*f(bn)>0);
if(f(an) != 0 && f(bn) != 0){
do{
cout<<"Tolerancia(10^-n) n: ";
cin>>n;
}while(n<=0);
bisetzion(an,bn,n);
}else cout<<"La ra\xA1z es uno de los extremos"<<endl;
cout<<"\xA8 \bDesea calcular de nuevo(s/n)\x3F";
cin>>resp;
}while(resp == 's' || resp == 'S');
system("pause");
return 0;
}
//******************************************************************************
void bisetzion(long double an,long double bn,int n){//función que realiza la bisección
long double pn=0,anterior,error=1000;
cout<<"n"<<" "<<"an"<<" "<<"bn"<<" "<<"pn"<<" "<<"f(an)"<<" "<<"f(pn)"<<" "<<"error"<<endl;
for(int i=0;error>pow(10.0,-n);++i){
anterior = pn;
pn = (an+bn)/2;
error = Abs((pn - anterior)/pn);
impresion(an,bn,pn,anterior,i);
f(an)*f(pn)<0 ? : an = pn;
f(bn)*f(pn)<0 ? : bn = pn;
}
}
//******************************************************************************
long double f(long double x){//función a aproximar
long double Fx;
Fx = pow(x,3) + 2*pow(x,2) + x -2;
return Fx;
}
//******************************************************************************
void impresion(long double an,long double bn,long double pn,long double anterior,int i){//función para imprimir los valores
long double error = Abs((pn - anterior)/pn);
cout<<setiosflags(ios::left)<<setw(3)<<i+1<<setprecision(7)<<setw(12)<<an<<setw(12)<<bn<<setw(12)<<pn<<setprecision(6)<<setw(14)<<f(an)<<setw(14)<<f(pn);
i == 0 ? cout<<" -"<<endl : cout<<error<<endl;
}
//******************************************************************************
long double Abs(long double numero){//función para valor absoluto
if(numero < 0) return -numero;
else return numero;
}
//******************************************************************************
Alguna sugerencia?, gracias de antemano.