Riemannsumme in c

Carty

Newbie
Registriert
Nov. 2014
Beiträge
6
hey,
ich habe folgendes problem...ich soll in c die riemannsumme von sinus werten berechnen....dann diese mit dem tatsächlichen wert vergleichen und dann erkennen wie man die Genauigkeit verbessern kann.

Nun zu meiner noch unvollendeter lösung:

array mit sinus werten gefüllt
Code:
#include <stdio.h>
#include <math.h>
 
#define size 50

 
int main(){
 
  double p[size]; //{sin(0), sin(0.02),...,sin(MAX)} wobei MAX vom benutzer eingegeben wird
  int z;
  double count = 0;
  float j;
 
    printf("NUMBER PLS: ");
    scanf("%f", &j);
    
    for( z = -50; z <=0; z++){
        p[z+50]=count;
        count += 0.02;
    }
    
     for(z = 0; z <= 50; z++)
     if(p[z] <= j){
     printf("%f\n", sin(p[z]));
}

      return EXIT_SUCCES;
}

danach steig ich aus...hab zwar jetzt schon viel versuch nachzulesen auf wiki oder anderen foren aber verstehn tu ich trozdem nicht wie ich die riemannsumme berechnen soll ohne funktion und anderen angaben...und überhaupt wie ich diese formel mit einfachen operatoren in c berechnen kann...

wär super wenn einer ein beispiel hat...lerne aus genauen vorgaben "wie es geht" immer am besten

vielen dank
mfg Carty
 
Ist das Riemannsche Integral dein Problem oder dessen Umsetzung in C? Wenn ersteres der Fall ist, würde ich mich eher damit beschäftigen, denn sobald Du das verstanden hast ist die Umsetzung gar nicht mehr so schwer.
 
ja da hast du wahrscheinlich recht...ein wenig versteh ich schon das es die fläche mittels rechtecken berechnet...die Umsetzung bleib trotzdem das problem leider...weiters muss ich bis heute abend damit fertig werden oder auch nicht haha....der post war eher mein letzter hilfeschrei bevor ich nichts abgebe...
 
Das sollte doch eigentlich kinderleicht sein. So recht versteh' ich nicht wo du genau nicht weiter kommst. Die Rechteckregel für numerische Integration ist dir bekannt?
 
So wie ich das verstanden habe ist die Riemannssumme ja nur das Integral der Funktion.
Das heisst du berechnest dir die Fläche unterhalb deiner Funktion damit.

Integrallösen wird wohl auch nicht das Problem sein, oder ?
 
Stimme Vulpecula zu!

Aber außerdem hat dein Programm einen schweren Anfängerfehler:
Das Array p[] ist mit 50 Elementen deklariert, du nutzt aber 51 ... :freak:
 
Also die einfachste Methode zur numerischen Integration ist die Mittelpunktsregel. Die kannst du überall nachschlagen.

Du sollst nun also wohl einmal numerisch integrieren und dann mit dem analytischen Integral vergleichen, dürfte wenn man sich das in Ruhe anschaut nicht allzu schwer sein.

Ganz andere Frage, wer hat dir denn die Schreibweise mit z=-50 bis 0 empfohlen? Ist nicht falsch, aber einfach ungewöhnlich.
Wobei, das <= ist schon falsch, du solltest doch bei < bleiben, da es kein p[50] gibt, wenn du 50 Elemente hast.

Und du bist dir auch bewusst, dass du in p keine Sinuswerte sondern nur x stehen hast, ja?
 
Dani1995 schrieb:
Lass mich raten, Uni Innsbruck? :)
;)



hab jetzt mal meinen array-code verbessert...kann mir einer sagen ob zumindest das hier passt?

Code:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define ARR_MAX 101
 
int main(){
	
	int i;
	double values[ARR_MAX];
	double count = -1;
	float x;

	printf("Please enter sin(max): ");
	scanf("%f", &x);
	

	for(int i = 0; i < 100 ; i++){
	values[i] = sin(count);
	count += 0.02;
}
	for(int i = 0; i < 1; i++){
	values[100] = sin(count);	
}
	
	for(i = 0; i <= 100; i++)
	if(values[i] <= x){
	printf("value[%d]: %f\n",i, values[i]);
}
	return EXIT_SUCCESS;
}
 
Jetzt hast du ein Array mit 101 Elementen. Und die bearbeitest du mit zwei Schleifen, eine für die ersten 100 Elemente, die zweite für das 101. Element. Warum nicht alle in einer Schleife?

Außerdem berechnest du den Sinus an 101 Stellen und füllst das Array mit den resultierenden 101 Werten. Das hat nicht sonderlich viel mit Integration zu tun, dazu wäre es eher erforderlich, die Werte alle zu summieren. Aber vorher mit der Schrittweite multiplizieren.

Edit: und wozu soll eigentlich die Abfrage gut sein, dass der aktuelle Wert <= x ist? Das führt doch nur dazu, dass alle Werte, die größer sind, bei der Ausgabe ausgelassen werden. Was soll das bezwecken?
 
Zuletzt bearbeitet:
mmh so?

Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define ARR_MAX 101
 
int main(){
	
	int i;
	double values[ARR_MAX];
	double count = -1;
	float x;

	printf("Please enter sin(max): ");
	scanf("%f", &x);
	

	for(int i = 0; i <= 100 ; i++){
	values[i] = sin(count);
	count += 0.02;
	if(values[i] > x){
break;}
}

	
	for(i = 0; i <= 100; i++)
	printf("value[%d]: %f\n",i, values[i]);

	return EXIT_SUCCESS;
}
 
Du willst also den Wert des Integrals von -1 bis x bestimmen? Demzufolge müsste deine Abfrage in Zeile 21 lauten if(count > x){break;} denn dein array enthält die y-Werte und nicht die x-Werte.

Edit:
Oder hab ich das falsch verstanden??
 
Zuletzt bearbeitet:
Ochse schrieb:
Du willst also den Wert des Integrals von -1 bis x bestimmen? Demzufolge müsste deine Abfrage in Zeile 21 lauten if(count > x){break;} denn dein array enthält die y-Werte und nicht die x-Werte.

Edit:
Oder hab ich das falsch verstanden??

ja du hast eig recht aba ich brauch sinus(xmax) und xmax soll eingelesen werden...also:

if(sin(count) > x){break;}

;)
 
Das heißt du gibst dir eine Obergrenze für den maximalen y-Wert vor. Darf man auch erfahren wozu? :rolleyes:

Der Rest sieht auf den ersten Blick okay aus. Jedoch fehlt dir natürlich noch die eigentliche Rechnung/Integration.
 
Zuletzt bearbeitet:
Das heißt du gibst dir eine Obergrenze für den maximalen y-Wert vor. Darf man auch erfahren wozu?

Steht so in der Angabe...

Der Rest sieht auf den ersten Blick okay aus. Jedoch fehlt dir natürlich noch die eigentliche Rechnung/Integration.

Die Rechnung/Integration wird sich leider nicht mehr ausgehen...Abgabe der aufgaben ist nur noch innerhalb ca. 1 std möglich....

Trotzdem danke für die Hilfe um das Array zu erstellen ;)

mfg Carty
 
Zurück
Oben