Dev - C++ - No se en que falla mi codigo de c++ (es corto)

 
Vista:
sin imagen de perfil
Val: 12
Ha aumentado su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No se en que falla mi codigo de c++ (es corto)

Publicado por NoaH009 (5 intervenciones) el 12/12/2020 17:23:42
Hola buenas este codigo tiene algun fallo de programación? No me da resultados correctos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//Regla trapezoidal compuesta
 
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
 
 
int main (void){
	const float PI=3.1416;
	int w,n,h,x,b,i;
	double sumS,sumC,Cx,C0,Cb,Sx,S0,Sb,ansS,ansC;
 
	cout<<"Introduce el valor de w y pulse Intro: ";
	cin>>w;
 
	cout<<"Introduce el valor de n(subintervalos) y pulse Intro: ";
	cin>>n;
 
	Cx=cos(PI*(x^2)/2);
	C0=cos(0);
	Cb=cos(PI*(b^2)/2);
 
	Sx=sin(PI*(x^2)/2);
	S0=sin(0);
	Sb=sin(PI*(b^2)/2);
 
	h=w/n; //Tamaño de cada subintervalo
	sumS=sumC=0;
 
	if (n==1){
		sumC=C0+Cb;
		ansC=sumC*h/2;
	}else{
	for(i=1;i<n;i++){
		x=h*i;
		sumC=sumC+2*Cx;
		fflush(stdin);
	}
	sumC=sumC+C0+Cb;
	ansC=sumC*h/2;
	}
 
if (n==1){
		sumS=C0+Cb;
		ansS=sumS*h/2;
	}else{
	for(i=1;i<n;i++){
	x=h*i;
	sumS=sumS+2*Sx;
	fflush(stdin);
	}
	sumS=sumS+S0+Sb;
	ansS=sumS*h/2;
	}
 
	cout<<"S("<<w<<") con n="<<n<<" es: "<<ansS<<"\n";
	cout<<"C("<<w<<") con n="<<n<<" es: "<<ansC;
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No se en que falla mi codigo de c++ (es corto)

Publicado por Alfil (1444 intervenciones) el 12/12/2020 17:52:48
En la línea

1
Cx = cos(PI*(x^2)/2);

La variable x no esta inicializada y por tanto tiene un valor indeterminado; además, para elevar al cuadrado utilizas el operador ^ que es el operador binario or exclusivo, también llamado xor.

Cambia la línea y el resto del código y recuerda inicializar previamente la variable x.

1
Cx = cos(PI * pow(x, 2) / 2 );
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No se en que falla mi codigo de c++ (es corto)

Publicado por Rodrigo (539 intervenciones) el 12/12/2020 18:36:24
Es posible que tambien tengas problemas de redondeo, porque estas diviendo valores de tipo int y cuando divides enteros, el resultado es entero tambien.

veo h/n y h/2 entre otras expresiones, todos estos valores seran enteros. Puedes forzar la conversion haciendo un cast explicito a alguno de los valores de la fraccion (o a ambos)

h / (double) n

tambien usando 2.0 en vez de 2.

Una opcion a usar pow(x,2) es directamente multiplicar x por si mismo: x * x
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 12
Ha aumentado su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No se en que falla mi codigo de c++ (es corto)

Publicado por NoaH009 (5 intervenciones) el 12/12/2020 20:30:50
Vale gracias ya he resuelto ese error. Estoy haciendo un problema y me piden que vaya aumentando n (subintervalos) para ver como evoluciona el resultado y se vuelve mas preciso.
Pero ahora mi problema es que al aumentar n, me da 0 todo el rato, no se si sabreis de la regla del trapecio para calcular integrales. Aun asi no creo que sea un fallo matemático porque he reescrito tal cual la formula y el algoritmo que ponia en mi libro en c++.

Cuando n=1,2 me da valores normales, pero luego en n=3,4 y 5 los valores son los mismos y a partir de 6 ya me da 0 todo el rato y no entiendo por que. (se que eso se puede interpretar como una evolucion pero no creo que sea correcto ya que me piden n=128,256).

Gracias.

Asi tengo el codigo ahora.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//Regla trapezoidal compuesta
 
#include<stdio.h>
#include<math.h>
#include<iostream>
 
using namespace std;
 
 
int main (void){
	const double PI=3.1416;
	int w,n,i;
	double x,h,b;
	double sumS,sumC,Cx,C0,Cw,Sx,S0,Sw,ansS,ansC;
 
	cout<<"Introduce el valor de w y pulse Intro: ";
	cin>>w;
 
	cout<<"Introduce el valor de n(subintervalos) y pulse Intro: ";
	cin>>n;
 
	Cx=cos(PI*pow(x,2)/2);
	C0=cos(0);
	Cw=cos(PI*pow(w,2)/2);
 
	Sx=sin(PI*pow(x,2)/2);
	S0=sin(0);
	Sw=sin(PI*pow(w,2)/2);
 
	h=w/n; //Tamaño de cada subintervalo
	sumS=sumC=0;
 
	if (n=1){
		sumC=C0+Cw;
		ansC=sumC*h/2;
	}else{
	for(i=1;i<n;i++){
		x=h*i;
		sumC=sumC+2*Cx;
	}
	sumC=sumC+C0+Cw;
	ansC=sumC*h/2;
	}
 
if (n=1){
		sumS=S0+Sw;
		ansS=sumS*h/2;
	}else{
	for(i=1;i<n;i++){
	x=h*i;
	sumS=sumS+2*Sx;
	}
	sumS=sumS+S0+Sw;
	ansS=sumS*h/2;
	}
 
	cout<<"S("<<w<<") con n="<<n<<" es: "<<ansS<<"\n";
	cout<<"C("<<w<<") con n="<<n<<" es: "<<ansC;
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No se en que falla mi codigo de c++ (es corto)

Publicado por Alfil (1444 intervenciones) el 13/12/2020 00:16:44
Siendo 'n' el número de divisores, 'a' el límite inferior, 'b' el límite superior, 'x' el valor de x y 'exp' el exponente de 'x' (3x^2 sería x = 3, exp = 2).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
    int n, a, b, x, exp;
 
    cout << "\nn: "; cin >> n;
    cout << "a: "; cin >> a;
    cout << "b: "; cin >> b;
    cout << "x: "; cin >> x;
    cout << "Exponente de x: "; cin >> exp;
 
    double result = x * a;
    double h = (b - a) / float(n);
    cout << "\nh: " << h;
 
    for (int i = 1; i < n; i++)
    {
        result += pow(b, exp) * x * (a + i * h);
    }
 
    result += pow(x, exp) * b;
    result *= h / 2;
 
    cout << "\nResultado: " << result << endl;
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 12
Ha aumentado su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No se en que falla mi codigo de c++ (es corto)

Publicado por Nh009 (5 intervenciones) el 13/12/2020 01:39:32
Este no codigo no sirve en mi problema ya que a mi me piden calcular las integrales de dos funciones determinadas, y x no tiene un valor prefijado, es distinto en cada iteración.
Dejo adjunto imagen de las dos funciones y del algoritmo del libro. w=5

Si alguien ve algun error en mi codigo, agradezco la ayuda.



3c10fdbe8bd9337bd3cbac11873b8177

WhatsApp-Image-2020-12-13-at-01.35.26
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No se en que falla mi codigo de c++ (es corto)

Publicado por Alfil (1444 intervenciones) el 13/12/2020 08:40:18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
    const double PI = 3.14159265359;
    int n, a, b;
 
    cout << "\nn: "; cin >> n;
    cout << "a: "; cin >> a;
    cout << "b: "; cin >> b;
 
    double h = (b - a) / float(n);
 
    double sumaCos = 0.0f;
    double sumaSin = 0.0f;
    double x;
 
    for (int i = 1; i < n; i++)
    {
        x = a + h * i;
        sumaCos += 2 * cos((PI / 2) * x * x);
        sumaSin += 2 * sin((PI / 2) * x * x);
    }
 
    sumaCos += (a * cos((PI / 2) * x * x)) + (b * cos((PI / 2) * x * x));
    sumaSin += (a * sin((PI / 2) * x * x)) + (b * cos((PI / 2) * x * x));
 
    double ansCos = sumaCos * (h / 2);
    double ansSin = sumaSin * (h / 2);
 
    cout << "\nC(w): " << ansCos << endl;
    cout << "\nS(w): " << ansSin << endl;
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

No se en que falla mi codigo de c++ (es corto)

Publicado por Rodrigo (539 intervenciones) el 13/12/2020 19:14:30
Hay que hacer unas correcciones al codigo provisto amablemente por Alfil:

- En la linea 29, hay que cambiar "cos" por "sin".
- Tanto en la linea 28 como en la linea 29 hay que cambiar la expresion para aplicar la funcion a "a" y "b", no a "x" asi:

1
sumaCos += cos(PI / 2) * a * a) + cos((PI / 2) * b * b);

Creo que eso recoge mejor lo indicado en el algoritmo, que indica SET SUM = SUM + f(a) + f(b)

Algo menor: La constante matematica PI ya existe, se llama M_PI, podria usarse en vez de definirla explicitamente. Para esto, remover PI del codigo y usar M_PI en vez. O bien,

1
const double PI = M_PI;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar