Ahoj, mám textový soubor, který na každé řádce obsahuje šest čísel (double) oddělených mezerou. Chtěl bych vždycky 4 řádky načíst (pole x1..x3, y1..y3) a lagrangeovsky je interpolovat (fce lagrange() - funkční), vypsat nalezené hodnoty v nule a pak vzít další 4 řádky atd. až do konce souboru. Následující kód mi funguje, pokud jsou řádky v souboru pouze 4, tedy provede se jedno zpracování. Už při osmi program kolabuje. Marně hledám chybu. Pomohl by někdo?
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string.h>
#include <stdio.h>
using namespace std;
double lagrange(double xcoords[],double ycoords[], double xin, int n) {
double fx = 0; //the value of f(x)
for(int i=0; i<n; i++){
double Lg = 1;
for(int j=0; j<n; j++){
if(i != j){
Lg *= (xin-xcoords[j])/(xcoords[i]-xcoords[j]);
}
}
fx += Lg*ycoords[i];
}
return (fx);
}
int main(int argc, char *argv[])
{
int rad = 4; // počet řádek a zároveň počet proložených bodů
//
double x1[rad], y1[rad];
double x2[rad], y2[rad];
double x3[rad], y3[rad];
int i = 0,delka;
string line;
ifstream myfile;
myfile.open ("test.txt");
if (myfile.is_open()) {
getline(myfile,line);
while (! myfile.eof() ) {
delka = line.size();
char* s = new char [delka];
strcpy(s, line.c_str());
char * pEnd;
y1[i] = strtod (s,&pEnd);
x1[i] = strtod (pEnd,&pEnd);
y2[i] = strtod (pEnd,&pEnd);
x2[i] = strtod (pEnd,&pEnd);
y3[i] = strtod (pEnd,&pEnd);
x3[i] = strtod (pEnd,NULL);
delete [] s;
getline(myfile,line);
i++;
if (i == rad) {
cout << lagrange(x1,y1,0,rad) << " "
<< lagrange(x2,y2,0,rad) << " "
<< lagrange(x3,y3,0,rad) << endl;
i = 0;
}
}
myfile.close();
}
else cout << "Soubor neotevren!";
system("PAUSE");
return EXIT_SUCCESS;
}
Soubor "test.txt" vypadá takto
6.27664 -2.18947e-007 6.27664 -2.18947e-007 6.27663 -2.19064e-007
6.28091 -7.5975e-008 6.28091 -7.5975e-008 6.28091 -7.60931e-008
6.28519 6.69988e-008 6.28519 6.69988e-008 6.28519 6.688e-008
6.28947 2.09971e-007 6.28947 2.09971e-007 6.28946 2.09851e-007
případně osmiřádková verze
6.27664 -2.18947e-007 6.27664 -2.18947e-007 6.27663 -2.19064e-007
6.28091 -7.5975e-008 6.28091 -7.5975e-008 6.28091 -7.60931e-008
6.28519 6.69988e-008 6.28519 6.69988e-008 6.28519 6.688e-008
6.28947 2.09971e-007 6.28947 2.09971e-007 6.28946 2.09851e-007
12.5618 -1.51992e-007 12.5618 -1.51992e-007 12.5618 -1.52465e-007
12.5661 -9.01916e-009 12.5661 -9.01916e-009 12.5661 -9.4929e-009
12.5704 1.33954e-007 12.5704 1.33954e-007 12.5704 1.33479e-007
12.5747 2.76924e-007 12.5747 2.76924e-007 12.5746 2.76448e-007