Вход

Просмотр полной версии : Интерполяция кубическими сплайнами



SlavikP
11.04.2025, 07:48
Вот, сделал для себя. Вроде даже работает.
Функциональный блок для интерполяции сплайнами. Сделан для массива в 11 точек (мне так надо было), но легко правится до произвольного кол-ва точек.
Делал для расчета уставки отопления по кусочно заданной температурной кривой. Первое желание было сделать линейной интерполяцией, но, подумав, решил, что это не наш метод :D
Собрано в Codesys 3.5.17, но несложно переносится на любую версию, даже на 2.3
Проверил работу поверхностно - вроде работает.
Если кому надо такое - берите и пользуйтесь свободно. Freeware.
Панамку для конструктивной критики подставил :D:D:D

IVM
11.04.2025, 12:16
Вот, сделал для себя. Вроде даже работает.
Функциональный блок для интерполяции сплайнами. Сделан для массива в 11 точек (мне так надо было), но легко правится до произвольного кол-ва точек.
Делал для расчета уставки отопления по кусочно заданной температурной кривой. Первое желание было сделать линейной интерполяцией, но, подумав, решил, что это не наш метод :D
Собрано в Codesys 3.5.17, но несложно переносится на любую версию, даже на 2.3
Проверил работу поверхностно - вроде работает.
Если кому надо такое - берите и пользуйтесь свободно. Freeware.
Панамку для конструктивной критики подставил :D:D:D

График уставки по отопления вроде примитивен (3 прямолинейных участка). Что там можно интерполировать ?

SlavikP
11.04.2025, 12:22
График уставки по отопления вроде примитивен (3 прямолинейных участка). Что там можно интерпретировать ?
Решил сразу сделать универсальный инструмент, для которого у меня уже есть иные применения. Отопление - частный случай. Подумал, что может быть это интересно кому то, кроме меня.
Кубические сплайны обеспечивают очень плавную результирующую кривую, без рывков и изломов. На современных процессорах разница в затратах на расчет между линейной аппроксимации и сплайнов - на уровне погрешности измерения.

GSA
11.04.2025, 13:00
Интерполяция более востребована в станках ЧПУ. Для прогнозирования кривой, на основе измеренных физических величин, более востребована аппроксимация.

SlavikP
11.04.2025, 13:12
Интерполяция более востребована в станках ЧПУ. Для прогнозирования кривой, на основе измеренных физических величин, более востребована аппроксимация.
На самом деле это не так.
Интерполяция - это подбор функции между пары известных точек.
Аппроксимация - это подбор функции, которая бы наилучшим образом ложилась бы на целую серию точек.
Интерполяция - полное совпадение, а аппроксимация - приближённое. При этом аппроксимация не гарантирует, что результирующая функция даст в известных опорных точках точный результат, а интерполяция - гарантирует это.

GSA
11.04.2025, 13:50
Если процесс стабилен, без разницы, что использовать. Если же нестабилен, интерполяция может сыграть злую шутку.
83019

SlavikP
11.04.2025, 14:18
Никто не идеален. Интерполяция - всего лишь инструмент. А как его правильно использовать - совсем другая наука.
Поэтому хорошо когда инструмент есть. Еще лучше, если есть два инструмента. Совсем хорошо - когда пять! Есть из чего выбрать.

GSA
11.04.2025, 15:01
Полностью согласен.
Каждый инструмент это время и труд, поэтому заслуживает благодарности. Но есть еще практика, где со временем начинаешь понимать, какой инструмент более менее подходит под твой процесс.

SlavikP
11.04.2025, 16:16
Вот именно. Чтоб понять, подходит или нет - надо попробовать. Если не подходит под ваши задачи - то и не надо страдать.
А если подходит, то почему бы и не да?
Но мне бы хотелось услышать критику конкретной реализации, а не пустые рассуждения о применимости или нет тех или иных методов.

FPavel
11.04.2025, 19:26
У меня нет CoDeSys 3.5, посмотреть не смогу.
Было бы хорошо, если бы исходники были опубликованы в тексте сообщения, было кратко приведено описание применения - ведь нет смысла в каждом цикле выполнять пересчёт полиномов, значит он происходит или в отдельном ФБ или по отдельной команде.
Также интересно видеть формулы - как расчёта полиномов, так и вычислений функции, ограничения входных и выходных значений.

Без этого - применение чужого кода - "прыжок веры" Индианы Джонса.

В своё время хотел применить интерполяционные формулы Лагранжа и Ньютона для корнеизвлекающей зависимости расхода от перепада давления. Хорошо, что сначала построил график на компьютере - в узлах значения совпадали, а между ними формировались "вертикальные волны", т.е. между узлами результат интерполяции был со значительной ошибкой. Думал о кубических сплайнах, но не стал тратить время и сделал кусочно-линейной интерполяцией.
Понятно, что со сплайнами будет лучше, но всё же есть смысл проверить.
Была сетка значений:
dP, кПа 0.610 2.450 5.540 9.860 14.100 22.400 30.500 39.800 50.300
F, т/ч 5 10 15 20 25 30 35 40 45

kondor3000
11.04.2025, 20:43
У меня нет CoDeSys 3.5, посмотреть не смогу.
Было бы хорошо, если бы исходники были опубликованы в тексте сообщения, было кратко приведено описание применения - ведь нет смысла в каждом цикле выполнять пересчёт полиномов, значит он происходит или в отдельном ФБ или по отдельной команде.


Вот работа проекта в эмуляции, зачем тут кубические сплайны, только автору понятно))) 83036
Тут двух точек за глаза)

Сергей0308
11.04.2025, 21:10
Я, бывало, для более плавного изменения применял нахождение среднего арифметического скользящим окном, в смысле, можно применить и другие способы обработки сигнала.

FPavel
11.04.2025, 22:17
да нет смысла на сплайны Вам переходить 83035
Да, так и есть - при вычислениях требуется по номеру диапазона найти коэффициенты, а по ним значение полинома - почти то же, что и при кусочно линейной интерполяции. Поэтому тогда и отказался.

А исходная идея была - сразу после ввода таблицы исходных данных получить функцию и сразу ею пользоваться без дополнительных вычислений.
Но в моём случае - проявились ограничения интерполяционной функции (полинома).

BETEP
11.04.2025, 23:27
Идея у SlavikP интересная, универсальный инструмент сделать.
Когда у меня непонятки, открываю Эксель, набиваю табличку, прошу его сделать график, потом прошу "Добавить линию тренда", потом в её свойствах выбираю формулу, смотрю что получилось, не зашло, методом тыка подбираю подходящий к задаче вариант.
Полином похоже к любой дырке затычка.
На последней картинке повод перепроверить данные.

FPavel
12.04.2025, 08:56
К РНИ (наладке в ходе эксплуатации) допускаются люди разной квалификации по математике и умения пользоваться Exel. С учётом этого вводимые данные должны иметь те же параметры, что и режимные карты (технологический регламент).
Т.е. вычисления параметров интерполирующей функции должны выполняться в ПЛК. Именно это (совершенно правильно) и сделал автор ФБ сплайнов.

Автор не рассказал о многих интересных вещах:
- что будет с Y при выходе X за пределы диапазона
- какие ограничения по входным данным (сортировка, что делать при меньшем 11 числе пар точек)
- какой диапазон применимости функции (какие кривые обрабатываются адекватно)
- как вычисляются полиномы - хотя бы для ознакомления с математикой - ведь есть несколько подходов ко второй производной на краях диапазона X
https://habr.com/ru/articles/323442/

И о применении ФБ - тоже хорошо бы рассказать - для выполнения пересчёта нужно сделать ..., в нормальной работе нужно ..., при нештатной работе (выходе X за пределы или др.) формируется ... и на выходе Y будет ..., и т.д.

Т.е. говорю об документировании библиотечного ФБ. Ведь автор предоставил ФБ не в ответ на просьбу страждущего, который разберётся в силу заинтересованности.
Всё это автор может сделать в первом сообщении темы - она позволяет редактирование - а здесь просто уведомить, что дополнил.

Моё личное мнение, что применение сплайнов - скорее прихоть, т.к. в эксплуатации потребует формирование сигнала пересчёта, и так же, как при кусочно-линейной интерполяции (КЛИ), потребует поиск диапазона. Т.е. при сравнении с КЛИ произойдёт усложнение HMI (команда пересчёт) и но преимуществ не будет.

Не посчитайте это придиркой - для ознакомления мне придётся ставить ненужный Codesys 3.5, а ведь в случае интересной реализации я бы "подрезал" алгоритм в другую среду разработки.

1exan
12.04.2025, 19:34
У меня нет CoDeSys 3.5, посмотреть не смогу.
Было бы хорошо, если бы исходники были опубликованы в тексте сообщения, было кратко приведено описание применения - ведь нет смысла в каждом цикле выполнять пересчёт полиномов, значит он происходит или в отдельном ФБ или по отдельной команде.
Также интересно видеть формулы - как расчёта полиномов, так и вычислений функции, ограничения входных и выходных значений.

Без этого - применение чужого кода - "прыжок веры" Индианы Джонса.

В своё время хотел применить интерполяционные формулы Лагранжа и Ньютона для корнеизвлекающей зависимости расхода от перепада давления. Хорошо, что сначала построил график на компьютере - в узлах значения совпадали, а между ними формировались "вертикальные волны", т.е. между узлами результат интерполяции был со значительной ошибкой. Думал о кубических сплайнах, но не стал тратить время и сделал кусочно-линейной интерполяцией.
Понятно, что со сплайнами будет лучше, но всё же есть смысл проверить.
Была сетка значений:
dP, кПа 0.610 2.450 5.540 9.860 14.100 22.400 30.500 39.800 50.300
F, т/ч 5 10 15 20 25 30 35 40 45

Есть ещё сплайн Акимы, дающий на выходе плавную кривую без резких выбросов на перегибах.
https://www.source-code.biz/snippets/typescript/akima/

BETEP
12.04.2025, 20:33
Есть ещё сплайн Акимы, дающий на выходе плавную кривую без резких выбросов на перегибах.
Вообще то глючит не по детски этот метод.
83061

1exan
14.04.2025, 04:27
Вообще то глючит не по детски этот метод.


Да, есть какой-то нюанс с крайними точками.
Возможно можно как-то обойти, добавив сдвигом дополнительных точек в конце-начале

SlavikP
14.04.2025, 07:32
В первом сообщении темы перевыложил проект.
По справедливой критике трудящихся метод EvaluateSpline сделан публичным, и теперь его можно вызывать из программы пользователя для получения значений сплайн-функции.
Пример использования показан в тестовом примере.