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


Автор: Cyber27 12.2.2019, 15:30
Здравствуйте, помогите исправить ошибки, пожалуйста smile 
Вот задачка:
Данная n + 1 пара значений (x; y), связанных функциональной зависимостью f (x) вашего варианта. Значение x выбраны в n + 1 равноудаленных точках отрезка [a; b]. Необходимо построить интерполяционный много-член Pn (x). Для этого:
1) Рассчитайте значение функции f (x) в равноудаленных точках отрезка [a; b]. Тем самым будут заполнены два массива x и y, которые можно интерпретировать как экспериментально измеренные значения каких-либо физических величин.
2) Рассчитайте разделены разницы по значениям функции в n + 1 узле.
3) Запрограммируйте вычисления интерполяционного многочлена Pn (x) по схеме Горнера.
4) Постройте в графическом окне графики исходной функции f (x) и интерполяционного многочлена Pn (x) на отрезке [a; b +]. Значение> 0 Пожалуйста, выберите таким, чтобы область построения графика по оси x была в 1: 5 2 раза больше отрезка, на котором выбрали узлы дискретизации.
5) Опыт поведение интерполяционного многочлена при различной количестве узлов дискретизации (4,5,7,10 точек).
6) Смоделируйте погрешность задания значений функции в узлах дискретамизации путем добавления к значениям функции случайных чисел.
Код

#include <math.h>
#include <windows.h>
#define e 2.71
int main()
{
// Инициализация графики
int gd, gm;
detectgraph(&gd,&gm);
initgraph(&gd,&gm,"");
    // цвет фона - белый
    setbkcolor(WHITE);
    // очистка окна
    cleardevice();
    // текущий цвет - черный
    setcolor(BLACK);
    // координаты центра
 
int X0=getMaxx()/2;
int Y0=getMaxy()/2;
    // оси координат
line(0,Y0,getMaxx(),Y0);
line(X0,0,X0,getMaxy());
    // единичные отрезки в пикселях
    int edx=20;
int edy=15;
    // текущий цвет - зелёный
setcolor(LIGHTBLUE);
    //  переменная цикла
int k;
    //  рисуем засечки
    // по оси х
    for(k=0;edx*k<X0;k++)
    {
        line(X0+k*edx,Y0-3,X0+k*edx,Y0+3); line(X0-k*edx,Y0-3,X0-k*edx,Y0+3);}
    // по оси у for(k=0;edy*k<Y0;k++)
    {
        line(X0-3,Y0+k*edy,X0+3,Y0+k*edy); line(X0-3,Y0-k*edy,X0+3,Y0-k*edy);}
    // текущий цвет - розовый
    setcolor(LIGHTRED);
// стиль линии - сплошная толстая
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
// описание переменных
float a,b,x,y,delta;
    //  интервал дискретизации
delta=0.1;
    // границы построения по оси х
a=-2; b=2;
    // Вычисление начальных координат
    x=a;
y=e^(-x);
    // перемещение указателя в начало графика
    moveto(X0+edx*x,Y0-edy*y);
    // цикл построения графика
    for(x=a;x<=b;x=x+delta)
    {
        y=e^(-x);
        lineto(X0+edx*x,Y0-edy*y);};
    // установка стиля текста
    settextstyle(SANS_SERIF_FONT,0,2);
    // вывод заголовка
outtextxy(180,10,"График функции f(x)=e^(-x)");
getch(); // ожидание
    // закрытие графического окна
    closegraph();
return 0;
    }

f(x)            [a,b]
e^(-x)    [-2,2] 

Автор: xvr 12.2.2019, 17:10
Ошибки в строках 1-66. Где вы это ископаемое дерь... чудо нашли? Верните обратно.

Автор: Cyber27 12.2.2019, 19:23
xvr, А можно и по другому? Но как?

Автор: xvr 13.2.2019, 17:30
Можно, например написать в Центр Помощи (на этом форуме) - там как раз пишут программы за вас

Автор: Cyber27 13.2.2019, 20:46
xvr, Мне не надо чтоб все за меня написали, мне надо узнать как самому это переделать. А то я сделал, а вы обобщили и даже не указали на ошибки

Автор: LeonidPr 15.2.2019, 02:31
Поясню.
Данный код написан судя по всему на старом Borland C 3.1 под DOS.
Сейчас как вы понимаете все это устарело. Функции рисования специфичны для библиотеки, используемой в те времена.
Сейчас у вас два варианта, либо использовать C++ Builder  какой-нить, быстро сделать там форму с компонентом на котором можно рисовать и на нем уже пользоваться соответствующими функциями для отрисовки линий.
Либо использовать любую простую библиотеку, которая позволяет порисовать на холсте и сохранить это в какой-нибудь файл навроде bmp, tga или еще что-нить.
Математическая часть с рассчетами соответственно останется та же, поменяются только та часть, где вы что-то рисуете.
Быстрое гугление подсказывает вот этот проектик.
https://github.com/Levsha1337/libtga
Все что вам надо там похоже есть
добавляете два файла в ваш проект, делаете массив для пикселей и рисуете функцией tga_line все что вам надо.
потом с помощью tga_export сохраняете нарисованное в файл, который можно открыть обычным просмотровщиком изображений.
Удобно тем, что можете нафигачить кучку файлов с разными параметрами отрисовки для
Цитата

5) Опыт поведение интерполяционного многочлена при различной количестве узлов дискретизации (4,5,7,10 точек).

Автор: xvr 15.2.2019, 18:57
Цитата(Cyber27 @  13.2.2019,  20:46 Найти цитируемый пост)
Мне не надо чтоб все за меня написали, мне надо узнать как самому это переделать. 

Там нечего переделывать. Ни один пункт из задания (за исключением первой части п4) не сделан (и даже намёков нет). Функция e^(-x) вычисляется неправильно (хинт - '^' в языке С это не возведение в степень)
Красивое рисование осей координат написано на мёртвой версии компилятора (как вам LeonidPr уже подсказал).

Что вы хотите переделать? Тут надо всё выкинуть и начинать с чистого листа.

Для начала - на каком языке это должно быть написано? И под какой графический фреймворк? (В задании в п4 упоминается 'графическое окно' - видимо нужен GUI. Если нет, то лучше с окнами не связываться, как опять же LeonidPr советовал)


Автор: LeonidPr 19.2.2019, 11:30
Боюсь наши с вами рассуждения уже нафиг никому не нужны. Лаба сделана и сдана (или не сдана)
Цитата(xvr @  15.2.2019,  18:57 Найти цитируемый пост)
И под какой графический фреймворк? 

Боже, что такое фреймворк, вы о чем??? smile 
Сказано же "Графическое окно", никаких фреймворков smile 

Автор: Cyber27 20.2.2019, 09:54
LeonidPr, Еще не сделана и не сдана, а информацию я учитываю

Автор: kapbepucm 25.2.2019, 15:16
Цитата(Cyber27 @  12.2.2019,  15:30 Найти цитируемый пост)
равноудаленных точках отрезка
в задании не указано значение этого "удаления"; в коде, насколько я понял, используется 0.1- это правильно?
Цитата(Cyber27 @  12.2.2019,  15:30 Найти цитируемый пост)
Рассчитайте разделены разницы по значениям функции в n + 1 узле
Моя русский не понимать твоя русский smile
Цитата(Cyber27 @  12.2.2019,  15:30 Найти цитируемый пост)
n + 1
в задании не нахожу значение n

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