/*
Nombre: Prácticas de Tablero 3.2
Nick: lamateporunyogur
Fecha: 25/10/09 20:37
Descripcion: Aplicación de la práctica 3.2 de Elementos de Programación.
Problema: Por más que lo intento, el resultado es una indeterminación.
No consigo reducir el valor de h hasta uno menor a 10^(-3).
O me da indeterminación, o me da 0. Espero que pueda exponer la solución.
*/
#include <iostream>
#include <cmath>
using namespace std;
main(void) {
float pi=3.14159, h;
double V, error, max, f, r, a, b;
double Ra, Rb; //Resultados f(a) y f(b)
int L;
f=(L*(0.5*pi*pow(r,2)-pow(r,2)*asin(h/r)-h*(sqrt((r*r)-(h*h)))))-V;//Declaramos la funcion despejando V.
r=1;
L=10;
V=12,4;
error=1;
max=0.001;
a=0;//h debe ser menor que el radio, y por ello está entre 0 y 1.
b=1;
Ra=0;
Rb=0;
while(error>max){
//Función principal
h = (a-(Ra*(b-a)/Rb-Ra));
//Actualizamos error
error = (fabs((h-V)*(h-V)));
//Calculamos resultados
Ra = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(a/r)-h*(sqrt((r*r)-(a*a)))))-V;
Rb = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(b/r)-h*(sqrt((r*r)-(b*b)))))-V;
//Actualizamos intervalos
if((Ra*f) < 0)
b = h;
else
a = h;
}
cout << "Practica 3.2 - Elementos de Programacion\n\n" <<"Solucion= " << h << "\n\n";
system ("pause");
return(0);
}
//Asignatura: Ampliacion de Matematicas
//Practica 1, ejercicio 2b
//Metodo de la Regula Falsi, Apartado B
#include <stdio.h>
#include <math.h>
int
main(void)
{
double tol = 0.0000001; //Tolerancia del error
double x; //Almacena el punto medio del intervalo a,b
double a,b; //Intervalos
double aR,bR,xR; //Resultados
double error = 1; //Se pone a 1 para que entre por primera vez en el while
int i = 0; //Contador
a = 2; //Definimos limite inferior intervalo
b = 3; //Definimos limite superior intervalo
while(error > tol){
//Actualizamos contador
i++;
//Calculamos punto medio
x = (((-aR)*(b-a)/(bR-aR))+a);
//Actualizamos error
error = (fabs(x - 2.41679918));
//Calculamos resultados
aR = (pow(a,4)-pow(a,3)-20);
bR = (pow(b,4)-pow(b,3)-20);
xR = (pow(x,4)-pow(x,3)-20);
//Actualizamos intervalos
if((aR*xR) < 0)
b = x;
else
a = x;
//Mostramos resultados por pantalla
printf("x: %.15f\nerror: %.15f\niteracion %d\n\n",x,error,i);
}
getchar();
}
/*
Name: Prácticas de Tablero 3.2
Copyright:
Author: lamateporunyogur
Date: 27/10/09 20:37
Description:
*/
#include <iostream>
#include <cmath>
using namespace std;
main(void) {
float pi=3.14159, h, a, b;
double V, error, max, f;
double Ra, Rb, Rh; //Resultados falsi
int L, r;
f=(L*(0.5*pi*(r^2)-(r^2)*asin(h/r)-h*(sqrt((r*r)-(h*h)))))-V;//Declaramos la funcion despejando V.
r=1;
L=10;
V=12,4;
error=1;
max=0.001;
a=0;//h debe ser menor que el radio, y por ello está entre 0 y 1.
b=1;
while(error>max){
//Función principal
h = (a-(Ra*(b-a)/Rb-Ra));
//Actualizamos error
error = (fabs((h-V)*(h-V)));
//Calculamos resultados
Ra = (L*(0.5*pi*(r^2)-(r^2)*asin(a/r)-h*(sqrt((r*r)-(a*a)))))-V;
Rb = (L*(0.5*pi*(r^2)-(r^2)*asin(b/r)-h*(sqrt((r*r)-(b*b)))))-V;
//Actualizamos intervalos
if((Ra*f) < 0)
a = h;
else
b = h;
}
cout << "h= " << h << "\n";
system ("pause");
return(0);
}
GameZelda escribió:^ no sirve para elevar, si no que es un XOR, que no tiene nada que ver.
Para elevar debes usar pow().
23 C:\Documents and Settings\lamateporunyogur\Escritorio\Practica 3.2.cpp call of overloaded `pow(int&, int)' is ambiguous
/*
Nombre: Prácticas de Tablero 3.2
Nick: lamateporunyogur
Fecha: 25/10/09 20:37
Descripcion: Aplicación de la práctica 3.2 de Elementos de Programación.
Problema: Por más que lo intento, el resultado es una indeterminación.
No consigo reducir el valor de h hasta uno menor a 10^(-3).
O me da indeterminación, o me da 0. Espero que pueda exponer la solución.
*/
#include <iostream>
#include <cmath>
#include <math.h>
using namespace std;
main(void) {
float pi=3.14159, h, a, b;
double V, error, max, f;
double Ra, Rb, Rh; //Resultados f(a) y f(b)
int L, r;
f=(L*(0.5*pi*pow(r,2)-pow(r,2)*asin(h/r)-h*(sqrt((r*r)-(h*h)))))-V;//Declaramos la funcion despejando V.
r=1;
L=10;
V=12,4;
error=1;
max=0.001;
a=0;//h debe ser menor que el radio, y por ello está entre 0 y 1.
b=1;
while(error>max){
//Función principal
h = (a-(Ra*(b-a)/Rb-Ra));
//Actualizamos error
error = (fabs((h-V)*(h-V)));
//Calculamos resultados
Ra = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(a/r)-h*(sqrt((r*r)-(a*a)))))-V;
Rb = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(b/r)-h*(sqrt((r*r)-(b*b)))))-V;
//Actualizamos intervalos
if((Ra*f) < 0)
b = h;
else
a = h;
}
cout << "Practica 3.2 - Elementos de Programacion\n\n" <<"Solucion= " << h << "\n\n";
system ("pause");
return(0);
}
IMPORTANTISIMO ESTO. Estás usando variables locales, estas viven en la pila (stack) y por tanto si no les pones valor tendrán un valor basura (de lo que hubiera antes en la pila). En C (y seguramente C++) sólo se hace la inicialización de variables automática si éstas son globales.Korso10 escribió:<br>Y para terminar, si usas variables sin inicializar te puede salir cualquier cosa, fijate que lo unico que has inicializado es pi y luego calculas f a partir de valores no inicializados.
Korso10 escribió:Si miras el error con mas detenimiento, verás que pow necesita que el primer argumento sea un double/long double/float, así que o declaras tu variable r como double o le haces un casting poniendo (double)r cada vez que la vayas a usar en la función pow.
Por otro lado la biblioteca cmath es lo mismo que math.h, por lo que puedes quitar la última del include.
Y para terminar, si usas variables sin inicializar te puede salir cualquier cosa, fijate que lo unico que has inicializado es pi y luego calculas f a partir de valores no inicializados.
juas escribió:<p>IMPORTANTISIMO ESTO. Estás usando variables locales, estas viven en la pila (stack) y por tanto si no les pones valor tendrán un valor basura (de lo que hubiera antes en la pila). En C (y seguramente C++) sólo se hace la inicialización de variables automática si éstas son globales.Korso10 escribió:<br>Y para terminar, si usas variables sin inicializar te puede salir cualquier cosa, fijate que lo unico que has inicializado es pi y luego calculas f a partir de valores no inicializados.
/*
Nombre: Prácticas de Tablero 3.2
Nick: lamateporunyogur
Fecha: 25/10/09 20:37
Descripcion: Aplicación de la práctica 3.2 de Elementos de Programación.
Problema: Por más que lo intento, el resultado es una indeterminación.
No consigo reducir el valor de h hasta uno menor a 10^(-3).
O me da indeterminación, o me da 0. Espero que pueda exponer la solución.
*/
#include <iostream>
#include <cmath>
using namespace std;
main(void) {
float pi=3.14159, h;
double V, error, max, f, r, a, b;
double Ra, Rb; //Resultados f(a) y f(b)
int L;
f=(L*(0.5*pi*pow(r,2)-pow(r,2)*asin(h/r)-h*(sqrt((r*r)-(h*h)))))-V;//Declaramos la funcion despejando V.
r=1;
L=10;
V=12,4;
error=1;
max=0.001;
a=0;//h debe ser menor que el radio, y por ello está entre 0 y 1.
b=1;
Ra=0;
Rb=0;
while(error>max){
//Función principal
h = (a-(Ra*(b-a)/Rb-Ra));
//Actualizamos error
error = (fabs((h-V)*(h-V)));
//Calculamos resultados
Ra = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(a/r)-h*(sqrt((r*r)-(a*a)))))-V;
Rb = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(b/r)-h*(sqrt((r*r)-(b*b)))))-V;
//Actualizamos intervalos
if((Ra*f) < 0)
b = h;
else
a = h;
}
cout << "Practica 3.2 - Elementos de Programacion\n\n" <<"Solucion= " << h << "\n\n";
system ("pause");
return(0);
}
#include <cstdlib>
int main(void) {
V=12.4;
f=(L*(0.5*pi*pow(r,2)-pow(r,2)*asin(h/r)-h*(sqrt((r*r)-(h*h)))))-V;//Declaramos la funcion despejando V.
h = (a-(Ra*(b-a)/Rb-Ra));
[code]h = (a-(Ra*(b-a)/Rb-Ra));
ercea escribió:Eso me pregunto yo, la verdad que no lo recuerdo todo pero el compilador no chilla si te equivocas de poner coma en lugar de punto? Qué interpreta? Lo probaría ahora mismo pero me da flojera a estas horas xD.
saludos!
warning: right-hand operand of comma has no effect
melado escribió:Respecto a eso, un consejo: activa siempre todos los warnings del compilador, y hazles caso. Suelen tener razón
Con GCC se activan con -Wall si mal no recuerdo.
ercea escribió:[...]
Como consejo personal, cuando tienes cosas como la asignación de f así de larga, lo ideal es que te crearas una función para tener más organizado y visible el código.
No sé como se llama el cálculo que haces en f, pero si se llama Calculo_X, pues create una función "Calculo_X(...)" con los parámetros que necesites ("Calculo_X(L, V, etc)"). Así, en lugar de tener que copiar y pegar ese tocho en el resto del código, como por ejemplo tienes en el bucle while que está repetido 2 veces más, pues llamas a dicha función creada pasándole los respectivos parámetros. Además, así es más fácil localizar el error, ya que si tienes 3 veces el tocho, puede que en 1 o 2 de ellas estén mal, o incluso las 3, y tienes que corregirlas una a una, mientras que llamando a la función, si está mal, está mal en las 3 y solo tienes que corregir la función.
asin(h/r)
/*
Nombre: Prácticas de Tablero 3.2
Nick: lamateporunyogur
Fecha: 25/10/09 20:37
Descripcion: Aplicación de la práctica 3.2 de Elementos de Programación.
Problema: Por más que lo intento, el resultado es una indeterminación.
No consigo reducir el valor de h hasta uno menor a 10^(-3).
O me da indeterminación, o me da 0. Espero que pueda exponer la solución.
*/
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
int main(void) {
float pi=3.14159, h;
double V, error, max, f, r, a, b;
double Ra, Rb; //Resultados f(a) y f(b)
int L;
r=1;
L=10;
V=12.4;
h=0;
error=1;
max=0.001;
a=0;//h debe ser menor que el radio, y por ello está entre 0 y 1.
b=1;
Ra=0;
Rb=0;
f=(L*(0.5*pi*pow(r,2)-pow(r,2)*asin(h/r)-h*(sqrt((r*r)-(h*h)))))-V;//Declaramos la funcion despejando V.
while(error>max){
//Función principal
h = (a-(Ra*(b-a)/(Rb-Ra)));
//Actualizamos error
error = (fabs((h-V)*(h-V)));
//Calculamos resultados
Ra = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(a/r)-h*(sqrt((r*r)-(a*a)))))-V;
Rb = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(b/r)-h*(sqrt((r*r)-(b*b)))))-V;
//Actualizamos intervalos
if((Ra*f) < 0)
b = h;
else
a = h;
}
cout << "Practica 3.2 - Elementos de Programacion\n\n" <<"Solucion= " << h << "\n\n";
system ("pause");
return(0);
}
melado escribió:Edit: y un poco más abajo, calculando Ra, en determinada iteración, se intenta calcular el arco seno de un número negativo, lo cual no existe.
GameZelda escribió:Se puede calcular el arco seno de cualquier valor entre [-1, 1].
/*
Nombre: Prácticas de Tablero 3.2
Nick: lamateporunyogur
Fecha: 25/10/09 20:37
Descripcion: Aplicación de la práctica 3.2 de Elementos de Programación.
Problema: Por más que lo intento, el resultado es una indeterminación.
No consigo reducir el valor de h hasta uno menor a 10^(-3).
O me da indeterminación, o me da 0. Espero que pueda exponer la solución.
*/
#include <iostream>
#include <cmath>
using namespace std;
//Declaramos la función "funcion_f"
double funcion_f(int L,double r, double X, double h, double V; //Sustituye "funcion_f" por "lo_que_sea"
//Función principal
main(void) {
double h;
double V, error, max, f, r, a, b;
double Ra, Rb; //Resultados f(a) y f(b)
int L;
//Inicializamos las variables declaradas
r=1;
h=0;
L=10;
V=12.4;
error=1;
max=0.001;
a=0;//h debe ser menor que el radio, y por ello está entre 0 y 1.
b=1;
Ra=0;
Rb=0;
f = funcion_f(L,r,h,h,V); //Calculamos "funcion_f" (sustituir por el mismo "lo_que_sea")
//Obtenemos "h" (este bloque también podrías meterlo en otra función)
while(error>max){
//Función principal
h = (a-(Ra*(b-a)/Rb-Ra));
//Actualizamos error
error = (fabs((h-V)*(h-V)));
//Calculamos resultados
Ra = funcion_f(L,r,a,h,V); //Calculamos "funcion_f" (sustituir por el mismo "lo_que_sea")
Rb = funcion_f(L,r,b,h,V); //Calculamos "funcion_f" (sustituir por el mismo "lo_que_sea")
//Actualizamos intervalos
if((Ra*f) < 0)
b = h;
else
a = h;
}
cout << "Practica 3.2 - Elementos de Programacion\n\n" <<"Solucion= " << h << "\n\n";
system ("pause");
return(0);
}
double funcion_f(int L,double r, double X, double h, double V) //Sustituye "funcion_f" por el mismo "lo_que_sea"
{
double resultado = 0, pi=3.14159; //He trasladado la variable pi a esta función puesto que no la necesitas en ningún otro lado
resultado = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(X/r)-h*(sqrt((r*r)-(X*X)))))-V;
return resultado;
}
ercea escribió:Mira, sería así (espero no equivocarme que es muy tarde ), por cierto, todavía te seguirá fallando por lo que han comentado que al ser Ra y Rb iguales a 0, el cálculo de "h" dentro del bucle while te sale la indeterminacion 0/0 y te dará otra vez NaN. Lo ideal es ver con más detenimiento el enunciado (jarkr está en la primera página) mañana a ver si lo miro. Esto más que nada es pa que veas como se haría la función ok?:/*
Nombre: Prácticas de Tablero 3.2
Nick: lamateporunyogur
Fecha: 25/10/09 20:37
Descripcion: Aplicación de la práctica 3.2 de Elementos de Programación.
Problema: Por más que lo intento, el resultado es una indeterminación.
No consigo reducir el valor de h hasta uno menor a 10^(-3).
O me da indeterminación, o me da 0. Espero que pueda exponer la solución.
*/
#include <iostream>
#include <cmath>
using namespace std;
//Declaramos la función "funcion_f"
double funcion_f(int L,double r, double X, double h, double V; //Sustituye "funcion_f" por "lo_que_sea"
//Función principal
main(void) {
double h;
double V, error, max, f, r, a, b;
double Ra, Rb; //Resultados f(a) y f(b)
int L;
//Inicializamos las variables declaradas
r=1;
h=0;
L=10;
V=12.4;
error=1;
max=0.001;
a=0;//h debe ser menor que el radio, y por ello está entre 0 y 1.
b=1;
Ra=0;
Rb=0;
f = funcion_f(L,r,h,h,V); //Calculamos "funcion_f" (sustituir por el mismo "lo_que_sea")
//Obtenemos "h" (este bloque también podrías meterlo en otra función)
while(error>max){
//Función principal
h = (a-(Ra*(b-a)/Rb-Ra));
//Actualizamos error
error = (fabs((h-V)*(h-V)));
//Calculamos resultados
Ra = funcion_f(L,r,a,h,V); //Calculamos "funcion_f" (sustituir por el mismo "lo_que_sea")
Rb = funcion_f(L,r,b,h,V); //Calculamos "funcion_f" (sustituir por el mismo "lo_que_sea")
//Actualizamos intervalos
if((Ra*f) < 0)
b = h;
else
a = h;
}
cout << "Practica 3.2 - Elementos de Programacion\n\n" <<"Solucion= " << h << "\n\n";
system ("pause");
return(0);
}
double funcion_f(int L,double r, double X, double h, double V) //Sustituye "funcion_f" por el mismo "lo_que_sea"
{
double resultado = 0, pi=3.14159; //He trasladado la variable pi a esta función puesto que no la necesitas en ningún otro lado
resultado = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(X/r)-h*(sqrt((r*r)-(X*X)))))-V;
return resultado;
}
Una función o la declaras primero y después la implementas, o puedes implementarla directamente (sin declararla) pero tiene que estar colocada (implementada) antes de su uso (es decir, si usas la función X en otra función Y, X tiene que estar implementada antes que Y).
Luego tienes que poner tantos parámetros como sea necesario para que sea lo más "genérico" posible y reutilizable. En tu caso veo que usas un "L", una "V", un "r", un "h", y luego un valor (que primero usas "h", luego "a", y luego "b"), llamemosle "X" ok?, y ya con esos parámetros, junto a variables que sean necesarias para cumplir el objetivo de la función (como por ejemplo el número pi, que si te das cuenta solo te hace falta para eso, así que mejor declararlo dentro de la función), los combinamos con las operaciones necesarias y creamos la función. Por último devolvemos el resultado de dichas operaciones (en este caso, puesto que es una función y no un procedimiento...).
Si quieres, para practicar, puedes hacer otra función para el bucle "while" y sacarlo de la función principal. Algo así:
h = funcion_solucion(max, error, ...);
Implementas la función "funcion_solucion" con los parámetros que veas conveniente y pruebas. Ya nos cuentas ^^.
saludos!
PD: Yo diría incluso que ese while se puede hacer una función recursiva, pero eso ya es mucha tela por ahora xD.
EDITO: Mirando por encima del enunciado, hay una cosa que me mosquea... por qué pones:
Ra = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(a/r)-h*(sqrt((r*r)-(a*a)))))-V;
En lugar de asin(a/r)-a*.... Viendo el enunciado, la definición de la función V, reemplazas h por cualquier valor y se tiene que reemplazar en toda aparición de h no?. En fin, mañana se mira con más detenimiento que es tarde xD
double funcion_f(int L,double r, double X, double V);
double funcion_f(int L,double r, double X, double V) //Sustituye "funcion_f" por el mismo "lo_que_sea"
{
double resultado = 0, pi=3.14159; //He trasladado la variable pi a esta función puesto que no la necesitas en ningún otro lado
resultado = (L*(0.5*pi*pow(r,2)-pow(r,2)*asin(X/r)-X*(sqrt((r*r)-(X*X)))))-V;
return resultado;
}
// Source code written by lamateporunyogur.
#include <iostream>
#include <cmath>
#ifndef M_PI
#define M_PI (3.1415926535897932384626433832795)
#endif
using namespace std;
float funcion_f(float t)
{
return sin(2*M_PI*t);
}
float segunda_derivada(float t)
{
return -4*M_PI*M_PI*funcion_f(2*M_PI*t);
}
float funcion_final(float a, float b)
{
return ( (b-a) * funcion_f((a+b)/2) ) + ( segunda_derivada((a+b)/2) * pow(b-a,3) / 24 );
}
int main ()
{
float a, b, valor = 0;
for(int i = 0; i < 100; i ++)
{
a = (float)i * 0.01;
b = a + 0.01;
valor += (funcion_final(a,b));
}
cout << "================================================================"<<endl<<"################## Practicas de tablero: 3.4 #################"<< endl<<"################## Elementos de Programacion #################"<< endl<<"================================================================"<<endl<<"#################### by lamateporunyogur ###################"<< endl<<"================================================================"<<endl;
cout << "\n\n Valor de la integral: "<<valor<<"\n\n"<<endl;
getchar();
return 0;
}