Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Алгоритм построения графика функции...

Автор: Гость_Serg_yl_* 8.3.2011, 19:44

Вечер добрый! :-)

Стоит задача.
Разработать программу для вычисления определенного интеграла методом средних прямоугольников для функции типа: 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. С нахождением определённого интеграла вроде все более менее понятно, хотя немного погодя тоже напишу.

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

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

Автор: abc 8.3.2011, 20:46

if (j=0) нужно записывать if (j==0)
ты всё время ставишь этим выражением J в 0, и цикл вечно крутится
хотя компилятор вроде должен ловить такие ошибки, как if (j=0)

стоит написать так:
yyy1[0]=a*cos(b*n)+pow(n,d);
for (int j=1; j<=iter; j++)
{
xxx1[j]=xxx1[j-1]+c;
yyy1[j]=a*cos(b*xxx1[j])+pow(xxx1[j],d);
}

и к слову:
если у тебя такая логическая связка:
if(x==0) ...
if(x!=0) ...
то её следует оформлять так:
if(x==0) ...
else ...

Автор: Serg_yl 8.3.2011, 21:36

abc - хоть как то заработало... Спасибо!

Теперь остается сделать проверку.

Еще один вопрос, а как можно сделать автоподгонку шкалы осей x и y?

Автор: Алексей1153 9.3.2011, 7:52

Цитата(Serg_yl @ 8.3.2011, 23:36) *
Еще один вопрос, а как можно сделать автоподгонку шкалы осей x и y?


рассчитать значения, выбрать максимумы, сделать припуски и отмасштабировать. Всего-то и делов ;)

Автор: Найтхевен 14.4.2011, 23:03

"1.4 Строим наш график.

cosFunCurve = new QwtPlotCurve("Test");
cosFunCurve->setPen(QPen(Qt::blue));
cosFunCurve->setData(xxx1,yyy1,iter);
cosFunCurve->attach(funPlot);
funPlot->replot();"

скажите,пожалуйста какие библиотеки надо подключать чтобы это юзать
и как полученный график отобразить в виджет(какой виджет)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)