#include #include #define MAXN 100000 double sor(int n, double *x, double *b, int niter, double omg) { int i, iter; double rez, rezi; for(iter = 0; iter < niter; iter++) { rez = 0; for(i = 1; i < n; i++) { rezi = (b[i] + x[i - 1] - 2 * x[i] + x[i + 1]) ; x[i] = x[i] + omg * rezi / 2; rezi = fabs(rezi); rez = (rezi > rez) ? rezi : rez; } printf("sor: iter %d, reziduum %g \n", iter, rez); if (rez < 1e-12) break; } return rez; } void uloz_reseni(const char *fname, int n, double *x) { FILE *fid; int i; printf("Reseni ukladam do souboru: %s \n", fname); fid = fopen(fname, "w"); if (fid == NULL) exit(1); for(i = 1; i < n; i++) fprintf(fid, "%20.10g\n", x[i]); fclose(fid); } main() { const maxiter = 15000; int n, i, k; double rez, h; double X[MAXN], XPOM[MAXN], B[MAXN]; n = 200; h = 1. / (n + 1); for(i = 1; i < n; i++) B[i] = h * h * sin( i * h * M_PI); for(i = 0; i <= n; i++) X[i] = 0; rez = sor(n, X, B, 80000, 1.7); printf("Finished sor \t %12.7g\n", k, rez); uloz_reseni("reseni.dat", n, X); }