Cómo hago que el usuario elija el tipo de función?

Iniciado por Antoniio, 17 Febrero 2016, 07:45 AM

0 Miembros y 1 Visitante están viendo este tema.

Antoniio

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:

#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.

engel lex

usa switch o if y coloca cada formula en una función diferente, según la opción que escoja, se llama a la respectiva función
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Antoniio

Usaré case, pero no puedo definir las funciones en código  :-\

engel lex

entonces coloca simplemente la operación dento del case y listo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Antoniio

Si, comprendo, una última cosa, que desde el principio no entendí, cómo declaro los símbolos?, por ejemplo: a Ω(k x + c) + b Ω = log, ln
Realmente ese era mi problema desde un principio pero planteé mal la pregunta..

engel lex

a nivel de código, no importan los simbolos, normalmente si son constantes, se hace un define con el nombre en mayúsculas y el valor... ejemplo

#define PI 3.1415926535
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Antoniio