Вот написал. Комментарии не писал, чтоб тебе было в чем разбираться. Описание метода взял http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#.D0.9C.D0.B5.D1.82.D0.BE.D0.B4_.D0.BF.D1.80.D1.8F.D0.BC.D0.BE.D1.83.D0.B3.D0.BE.D0.BB.D1.8C.D0.BD.D0.B8.D0.BA.D0.BE.D0.B2.
| Код | #include <stdio.h> #include <math.h>
int maxloop = 1000;
double int_func(double x) { return 5*x*x+7*x+12; }
double calc(double (*func)(double), double a, double b, double step) { double _a = a; double _b = a + step; double res = 0; while(_b <= b) { double x = (_a + _b)/2.0; res += func(x)*(_b-_a); _a = _b; _b += step; } return res; }
double solve(double (*func)(double), double a, double b, double eps) { double r1 = 0, r2 = 0; int loop = 0; double step1 = (b - a), step2 = (b - a)/2.0; do { loop++; r1 = calc(func,a,b,step1); r2 = calc(func,a,b,step2); if (loop > maxloop) { printf("Слишком много проходов\n"); } step1 = step2; step2 = step2/2.0; } while(fabs(r1 - r2) >= eps); return r2; }
int main(int argc, char* argv[]) { double eps = 0.1; double a = -1; double b = 5; double res = solve(int_func,a,b,eps); printf("Ответ: %f\n",res); return 0; }
|
|