numerische integration mit c
Habe ich zu tun, numerische integration für eine Reihe von Datenpunkten aus einer text-Datei.
meine Daten Punkte Aussehen
0.5 0.479425539
1 0.841470985
1.5 0.997494987
2 0.909297427
2.5 0.598472144
3 0.141120008
3.5 -0.350783228
4 -0.756802495
4.5 -0.977530118
5 -0.958924275
mein Versuch
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
double trapezoidalRule (double size, double *x, double *y)
{
double sum = 0.0,increment;
int k;
for (k=1; k<size; k++)
{
increment = 0.5 * (x[k]-x[k-1]) * (y[k]+y[k-1]);
sum += increment;
}
return sum;
_getch();
}
int main ( int argc, char * argv[])
{
char* fileName = argc > 1 ? argv[1] : "C:\\Users\\g\\Desktop\\test.txt";
FILE* inputFile = fopen (fileName, "r");
int k;
double size,*x, *y;
double integral;
if ( inputFile ==NULL)
{
fprintf (stderr, "Open failed for %s\n", fileName);
exit(666);
}
fscanf (inputFile, "%d", &size);
printf (" Number of points: %d\n", size);
x = (double *) calloc (size, sizeof(*x));
y = (double *) calloc (size, sizeof(*y));
for (k=0; k< size; k++)
fscanf (inputFile, "%lg%lg" , x+k, y+k);
integral = trapezoidalRule (size, x, y);
printf ("Integral:", "\n", integral);
printf ("\n");
//printf ("check: ","\n", x[size-1], log(x[size-1]) );
_getch();
}
aber ich bin nicht immer die erforderliche Leistung... ich kann nicht Bild, was ist falsch... Es shud Wünsche, berechne den ganzzahligen Wert, aber seine nicht... auch keine der Punkte ist falsch...es ist einfach nur die erste Zahl, nicht mitgerechnet die keine Punkte... pls help...
- warum startet Ihr nicht mit einer sehr trivialen test-Eingang (z.B. 0 0; 1 1), wo Sie das Ergebnis wissen, und starten Sie das Debuggen auf die Eingaben.
- Sind Sie sicher, dass die
printf ("Integral:", "\n", integral);
Zeile korrekt ist? Ich sehe keine format-Bezeichner im format-parameter "Integral:". - Das ist sicherlich nicht C++ - code.
- So starten Sie mit, warum die tag dies als C++, wenn es kein C++ - code drin? Außerdem, warum verwenden Sie ein
double
für die Größe (das führt zu deinem problem mitsize
alsfscanf
wird gesagt, zu Lesen eine ganze Zahl ist). - Bessere Nutzung Simpsons " - Regel, es ist viel genauer für äquidistante Punkte. Wo kommen die Punkte her? Es gibt bessere Methoden, aber Sie wählen die Punkte selbst...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass Sie nicht weit entfernt von der Lösung. Die Formel, die zumindest gut aussieht.
Vielleicht der größte Fehler, den Sie haben in Ihrem code ist, dass Sie fehlen, in der Ihre Daten, die Anzahl der Punkte zu Lesen. So geben Sie den code liest wohl "0.5" als die Anzahl der Punkte. Dann die Schleife über k geht für k=0 (k=1>0.5), dass wahrscheinlich der Grund, warum Sie haben nur einen Punkt. Damit es funktioniert, ich habe die folgenden änderungen:
int size
printf ("Integral: %lg \n", integral);
Gemacht, dass es für mich arbeiten.
(Big edit da hat es schon retaged C statt C++)
Sollten Sie nicht Lesen, und ein double-Wert mit
%d
stattdessen verwenden Sie den Formatbezeichner%lf
. Auch verstehe ich nicht, warumsize
ist doppelt. Es scheint, es kann nur sein, eine nicht-negative ganze Zahl, so wahrscheinlichunsigned
am besten hier.