Просмотр полной версии : Интерполяция кубическими сплайнами
Вот, сделал для себя. Вроде даже работает.
Функциональный блок для интерполяции сплайнами. Сделан для массива в 11 точек (мне так надо было), но легко правится до произвольного кол-ва точек.
Делал для расчета уставки отопления по кусочно заданной температурной кривой. Первое желание было сделать линейной интерполяцией, но, подумав, решил, что это не наш метод :D
Собрано в Codesys 3.5.17, но несложно переносится на любую версию, даже на 2.3
Проверил работу поверхностно - вроде работает.
Если кому надо такое - берите и пользуйтесь свободно. Freeware.
Панамку для конструктивной критики подставил :D:D:D
Вот, сделал для себя. Вроде даже работает.
Функциональный блок для интерполяции сплайнами. Сделан для массива в 11 точек (мне так надо было), но легко правится до произвольного кол-ва точек.
Делал для расчета уставки отопления по кусочно заданной температурной кривой. Первое желание было сделать линейной интерполяцией, но, подумав, решил, что это не наш метод :D
Собрано в Codesys 3.5.17, но несложно переносится на любую версию, даже на 2.3
Проверил работу поверхностно - вроде работает.
Если кому надо такое - берите и пользуйтесь свободно. Freeware.
Панамку для конструктивной критики подставил :D:D:D
График уставки по отопления вроде примитивен (3 прямолинейных участка). Что там можно интерполировать ?
График уставки по отопления вроде примитивен (3 прямолинейных участка). Что там можно интерпретировать ?
Решил сразу сделать универсальный инструмент, для которого у меня уже есть иные применения. Отопление - частный случай. Подумал, что может быть это интересно кому то, кроме меня.
Кубические сплайны обеспечивают очень плавную результирующую кривую, без рывков и изломов. На современных процессорах разница в затратах на расчет между линейной аппроксимации и сплайнов - на уровне погрешности измерения.
Интерполяция более востребована в станках ЧПУ. Для прогнозирования кривой, на основе измеренных физических величин, более востребована аппроксимация.
Интерполяция более востребована в станках ЧПУ. Для прогнозирования кривой, на основе измеренных физических величин, более востребована аппроксимация.
На самом деле это не так.
Интерполяция - это подбор функции между пары известных точек.
Аппроксимация - это подбор функции, которая бы наилучшим образом ложилась бы на целую серию точек.
Интерполяция - полное совпадение, а аппроксимация - приближённое. При этом аппроксимация не гарантирует, что результирующая функция даст в известных опорных точках точный результат, а интерполяция - гарантирует это.
Если процесс стабилен, без разницы, что использовать. Если же нестабилен, интерполяция может сыграть злую шутку.
83019
Никто не идеален. Интерполяция - всего лишь инструмент. А как его правильно использовать - совсем другая наука.
Поэтому хорошо когда инструмент есть. Еще лучше, если есть два инструмента. Совсем хорошо - когда пять! Есть из чего выбрать.
Полностью согласен.
Каждый инструмент это время и труд, поэтому заслуживает благодарности. Но есть еще практика, где со временем начинаешь понимать, какой инструмент более менее подходит под твой процесс.
Вот именно. Чтоб понять, подходит или нет - надо попробовать. Если не подходит под ваши задачи - то и не надо страдать.
А если подходит, то почему бы и не да?
Но мне бы хотелось услышать критику конкретной реализации, а не пустые рассуждения о применимости или нет тех или иных методов.
У меня нет 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
Я, бывало, для более плавного изменения применял нахождение среднего арифметического скользящим окном, в смысле, можно применить и другие способы обработки сигнала.
да нет смысла на сплайны Вам переходить 83035
Да, так и есть - при вычислениях требуется по номеру диапазона найти коэффициенты, а по ним значение полинома - почти то же, что и при кусочно линейной интерполяции. Поэтому тогда и отказался.
А исходная идея была - сразу после ввода таблицы исходных данных получить функцию и сразу ею пользоваться без дополнительных вычислений.
Но в моём случае - проявились ограничения интерполяционной функции (полинома).
Идея у SlavikP интересная, универсальный инструмент сделать.
Когда у меня непонятки, открываю Эксель, набиваю табличку, прошу его сделать график, потом прошу "Добавить линию тренда", потом в её свойствах выбираю формулу, смотрю что получилось, не зашло, методом тыка подбираю подходящий к задаче вариант.
Полином похоже к любой дырке затычка.
На последней картинке повод перепроверить данные.
К РНИ (наладке в ходе эксплуатации) допускаются люди разной квалификации по математике и умения пользоваться Exel. С учётом этого вводимые данные должны иметь те же параметры, что и режимные карты (технологический регламент).
Т.е. вычисления параметров интерполирующей функции должны выполняться в ПЛК. Именно это (совершенно правильно) и сделал автор ФБ сплайнов.
Автор не рассказал о многих интересных вещах:
- что будет с Y при выходе X за пределы диапазона
- какие ограничения по входным данным (сортировка, что делать при меньшем 11 числе пар точек)
- какой диапазон применимости функции (какие кривые обрабатываются адекватно)
- как вычисляются полиномы - хотя бы для ознакомления с математикой - ведь есть несколько подходов ко второй производной на краях диапазона X
https://habr.com/ru/articles/323442/
И о применении ФБ - тоже хорошо бы рассказать - для выполнения пересчёта нужно сделать ..., в нормальной работе нужно ..., при нештатной работе (выходе X за пределы или др.) формируется ... и на выходе Y будет ..., и т.д.
Т.е. говорю об документировании библиотечного ФБ. Ведь автор предоставил ФБ не в ответ на просьбу страждущего, который разберётся в силу заинтересованности.
Всё это автор может сделать в первом сообщении темы - она позволяет редактирование - а здесь просто уведомить, что дополнил.
Моё личное мнение, что применение сплайнов - скорее прихоть, т.к. в эксплуатации потребует формирование сигнала пересчёта, и так же, как при кусочно-линейной интерполяции (КЛИ), потребует поиск диапазона. Т.е. при сравнении с КЛИ произойдёт усложнение HMI (команда пересчёт) и но преимуществ не будет.
Не посчитайте это придиркой - для ознакомления мне придётся ставить ненужный Codesys 3.5, а ведь в случае интересной реализации я бы "подрезал" алгоритм в другую среду разработки.
У меня нет 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/
Есть ещё сплайн Акимы, дающий на выходе плавную кривую без резких выбросов на перегибах.
Вообще то глючит не по детски этот метод.
83061
Вообще то глючит не по детски этот метод.
Да, есть какой-то нюанс с крайними точками.
Возможно можно как-то обойти, добавив сдвигом дополнительных точек в конце-начале
В первом сообщении темы перевыложил проект.
По справедливой критике трудящихся метод EvaluateSpline сделан публичным, и теперь его можно вызывать из программы пользователя для получения значений сплайн-функции.
Пример использования показан в тестовом примере.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot