Russian Qt Forum
Апрель 25, 2024, 18:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Алгоритм построения графика функции...  (Прочитано 3819 раз)
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. С нахождением определённого интеграла вроде все более менее понятно, хотя немного погодя тоже напишу.

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

Огромное спасибо!
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #1 : Март 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-го элемента. Условие автоматически становится ненужным.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #2 : Март 08, 2011, 20:54 »

Вдогонку. А какой компилятор позволяет так объявлять сишный массив, если iter не константа?
Цитировать
double xxx1[iter], yyy1[iter];
Записан
serg_yl
Гость
« Ответ #3 : Март 08, 2011, 21:10 »

Стоит Ubuntu 10.10, qt устанавливал из оф. репозитория.

Я так думаю что скорей всего это mingw.
« Последнее редактирование: Март 08, 2011, 21:33 от serg_yl » Записан
brankovic
Гость
« Ответ #4 : Март 08, 2011, 22:12 »

Вдогонку. А какой компилятор позволяет так объявлять сишный массив, если iter не константа?
Цитировать
double xxx1[iter], yyy1[iter];

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

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

Это Gnu Compiler Collection, более известный как gcc
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.064 секунд. Запросов: 22.