Russian Qt Forum

Qt => Вопросы новичков => Тема начата: serg_yl от Март 08, 2011, 19:27



Название: Алгоритм построения графика функции...
Отправлено: serg_yl от Март 08, 2011, 19:27
Вечер добрый! :-)

Стоит задача.
Разработать программу для вычисления определенного интеграла методом средних прямоугольников для функции типа: y=a*cos(b*x)+x^d. Коэффициенты a, b, c, d и границы интервала интегрирования  считываются из файла. В диалоге необходимо изобразить график функции, графики прямых, ограничивающих область интегрирования, оси координат.

Итак, начну излагать все порядку. Прошу меня поправить, если я не правильно излагаю алгоритм нахождения координат точек графики и вычисления определённого интеграла методом средних прямоугольников.

1. Построим график функции y=a*cos(b*x)+x^d.
1.1 Присвоим значения коэф. и границы интегрирования:
Код:
n=0; //граница A
        k=10; //Граница B     
        a=1;
        b=5;
        c=0.5; //Точность вычисления или коэф. дифференцирования
        d=3;
1.2 Получим общее кол. точек графика (итераций) с помощью метода средних прямоугольников.
Код:
iter=(qRound (qAbs(k-n)/c))
1.3 Найдем координаты всех точек для построения графика ограниченного [0, 10].
Код:
 double xxx1[iter], yyy1[iter];
for (j=0; j<=iter; j++)
        {
            if (j=0)
            {
                xxx1[j]=n;
            }
            if (j!=0)
            {
            xxx1[j]=xxx1[j-1]+c; //Получаем след. значение координаты x, прибавляя к привед. зн. коэф. дифференцирования
            }
            //Находим координату y путем подставления полученного зн. x  в функцию y=a*cos(b*x)+x^d
            yyy1[j]=a*cos(b*xxx1[j])+pow(xxx1[j],d);
}
Таким образом мы получаем 2 массива (xxx1 - коорд. X и yyy1 - коорд. Y ) типа double.
1.4 Строим наш график.
Код:
cosFunCurve = new QwtPlotCurve("Test");
        cosFunCurve->setPen(QPen(Qt::blue));
        cosFunCurve->setData(xxx1,yyy1,iter);
        cosFunCurve->attach(funPlot);
        funPlot->replot();
И тут начинается интересное... Программа запускается без ошибок, но график не строиться, а сама программа зависает (не отвечает). Приходится завершать только через диспетчер задач.

2. С нахождением определённого интеграла вроде все более менее понятно, хотя немного погодя тоже напишу.

Прошу вашей помощи!

Огромное спасибо!


Название: Re: Алгоритм построения графика функции...
Отправлено: Hellraiser от Март 08, 2011, 20:51
Даже не вникая в суть алгоритма...
1. Массивы в С/С++ начинаются с 0-го элемента и заканчиваются элементом (кол-во элементов - 1). Это надо помнить и это очень важно. Почему так говорю:
Цитировать
double xxx1[iter], yyy1[iter];
for (j=0; j<=iter; j++)
Как видно, элементарно выходим за границу массива. Надо условие j<iter
2. Это не ошибка, но зачем лишние вычисления: до цикла считаем нулевые элементы, т.е. xxx1[0] и yyy1[0]. Цикл, соответственно, начинаем с 1-го элемента. Условие автоматически становится ненужным.


Название: Re: Алгоритм построения графика функции...
Отправлено: Hellraiser от Март 08, 2011, 20:54
Вдогонку. А какой компилятор позволяет так объявлять сишный массив, если iter не константа?
Цитировать
double xxx1[iter], yyy1[iter];


Название: Re: Алгоритм построения графика функции...
Отправлено: serg_yl от Март 08, 2011, 21:10
Стоит Ubuntu 10.10, qt устанавливал из оф. репозитория.

Я так думаю что скорей всего это mingw.


Название: Re: Алгоритм построения графика функции...
Отправлено: brankovic от Март 08, 2011, 22:12
Вдогонку. А какой компилятор позволяет так объявлять сишный массив, если iter не константа?
Цитировать
double xxx1[iter], yyy1[iter];

Такое расширение gcc прикольное. Чуть не то указал и SIGSEGV.

Я так думаю что скорей всего это mingw.

Это Gnu Compiler Collection, более известный как gcc