Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > написание алгоритма на С


Автор: CrazzzyPerson 7.5.2008, 10:21
Нужно разработать алгоритм численного интегрирования методом прямоугольников с автоматическим выбором шага интегрирования на С
совсем не понимаю что и как. если кому не очень трудно напишите плиз...буду очень благодарен!

Автор: jonie 7.5.2008, 10:35
алгоритмы пишутся на мат языке.
поищи книжки по численным методам. там вполне описан твой метод...

Автор: bronislav 7.5.2008, 12:33
Вот написал. Комментарии не писал, чтоб тебе было в чем разбираться. Описание метода взял 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;
}


Автор: CrazzzyPerson 10.5.2008, 10:42
спасибо огромное..прям щас сяду буду разбираться в коде.)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)