@BlinCT

Ошибка в алгоритм получения интерполяции с помощью Лагранжа?

Всем привет
С такими расчетами я столкнулся впервые, сам его не писал полностью, но вот странность что при определенных значениях в расчетах я получаю Nan.
Мне нужно получить расчитаные точки для интерполяции, и нашел в инете примерно как он должен выглядеть.
Ниже привожу с какими точками я тестирую и сам аргаритм.

18;24
21;21
23;18
24;16
23;11
20;8

И вот сам алгоритм

QList<QPointF> tmpResultPoints;
            QList<QList<QPointF> > tmpResultPoints2;

            auto currentX = list.m_List.begin()->m_X;
            auto endX = list.m_List.last().m_X;

            while(currentX <= endX)
            {
                qreal workX = currentX;
                qreal calcY = 0.0;

                for(int j = 0; j < list.m_List.count(); ++j)
                {
                    qreal Hi = 0.0;
                    bool bFirst = true;

                    for(int i = 0; i < list.m_List.count(); ++i)
                    {
                        if(i != j)
                        {
                            qreal calc = (workX - list.m_List.at(i).m_X) / (list.m_List.at(j).m_X - list.m_List.at(i).m_X);

                            if(bFirst)
                            {
                                Hi = calc;
                                bFirst = false;
                            }
                            else
                            {
                                Hi *= calc;
                                bFirst = false;
                            }
                        }
                    }

                    qreal Px = list.m_List[j].m_Y * Hi;
                    calcY += Px;
                }

                tmpResultPoints.append(QPointF(workX, calcY));
                currentX += m_SizeStep;
            }


Помогите пожалуйста кто понимает в таких расчетах. Не понимаю где ошибка.
Если надо я могу даже тестовую рабочую прогу скинуть.
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
У вас там во входных данных 2 точки с одинаковым x (23) и разным y (18, 11). В результате получается деление на 0.

Нельзя инетрполировать такие данные полиномом. Ибо это функция от x - для каждого x одно значение y.

Ошибка не в программе, а в некорректных входных данных.

Можно интерполировать параметрически, если хотите. Заведите параметр t и ищите две функции x(t), y(t) - скармливайте этой программе 2 набора данных 1,x1;2,x2;3,x3...n;xn и 1,y1;2,y2;...n,yn.

Тогда у вас будет кривая заданная двумя полиномами, проходящая через заданные точки в заданном порядке.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы