Что такое интерполяция в программировании
Перейти к содержимому

Что такое интерполяция в программировании

Люблю усложнять, или как работает интерполяция

Люблю усложнять, или как работает интерполяция главное изображение

Batman нужно написать через переменную. При формировании итоговой строки использовать интерполяцию. Вывод должен получиться таким:

_Have you seen this new movie called Batman? Yes, I liked._ 

Интерполяция проще, чем я думала.

Когда мы используем f-строку, вместе с multi-line, не надо уже пихать туда все, что узнала. Я из теории не поняла, что если есть «»», то уже не надо одинарные кавычки, что »’, можно использовать, даже если в предложении есть апостроф. Если у нас есть переменная, то не надо ее выделать +, как в конкатенации и вообще примере не хватило, что бы все понять.

new_film = 'Batman' print (f'''Have you seen this new movie called new_film>? Yes, I liked.''') 

Все очень просто. Решила я задание, конечно после просмотренного решения. Иногда нужно просто расслабиться и попытаться сделать проще. С этим у меня проблемы.

P.S. Я изменила предложения, что я написала, не проверяла на курсе, если найдете ошибки, буду рада их поправить, но вроде бы все верно. В программировании и математике я полный 0 и мне особенно сложно все дается и особенно радостно, когда что то получается, интересно, что будет дальше.

JavaScript: Интерполяция

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

const firstName = 'Joffrey'; const greeting = 'Hello'; console.log(greeting + ', ' + firstName + '!'); // => Hello, Joffrey! 

Это довольно простой случай, но даже здесь нужно приложить усилия, чтобы увидеть, какая в итоге получится строка. Нужно следить за несколькими кавычками и пробелами, и без вглядывания не понять, где что начинается и кончается.

Есть другой, более удобный и изящный способ решения той же задачи — интерполяция. Вот, как это выглядит:

const firstName = 'Joffrey'; const greeting = 'Hello'; // Обратите внимание на ограничители строки, это бектики // Интерполяция не работает с одинарными и двойными кавычками console.log(`$, $!`); // => Hello, Joffrey! 

Мы просто создали одну строку и «вставили» в неё в нужные места константы с помощью знака доллара и фигурных скобок $ < >. Получился как будто бланк, куда внесены нужные значения. И нам не нужно больше заботиться об отдельных строках для знаков препинания и пробелов — все эти символы просто записаны в этой строке-шаблоне.

В одной строке можно делать сколько угодно подобных блоков.

Интерполяция работает только со строками в бэктиках. Это символ `.

Почти во всех языках интерполяция предпочтительнее конкатенации для объединения строк. Строка при этом получается склеенная, и внутри неё хорошо просматриваются пробелы и другие символы. Во-первых, интерполяция позволяет не путать строки с числами (из-за знака +), а во-вторых, так гораздо проще (после некоторой практики) понимать строку целиком.

Задание

Выведите на экран строку Do you want to eat, ? , где вместо должна использоваться константа stark . Вывод должен получиться таким:

Do you want to eat, Arya?

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

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

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

Определения

  • Интерполяция — способ соединения строк через вставку значений переменных в строку-шаблон с помощью фигурных скобок. Например, `Hi, $!` .

Круговая интерполяция – G02 и G03

Если обработку по прямой линии несложно производить и на простом станке с ручным управлением, то перемещение инструмента по дуге точнее и проще выполнять на станке с ЧПУ. Коды G02 и G03 предназначены для выполнения круговой интерполяции. Код G02 используется для перемещения по дуге по часовой стрелке, a G03 – против часовой стрелки. Направление перемещения определяется, когда мы смотрим на инструмент со стороны шпинделя, в отрицательном направлении оси Z. Как и при выполнении линейной интерполяции, в кадре круговой интерполяции необходимо указать скорость рабочей подачи F.

Оглавление

  • Основы числового программного управления
    • Автоматическое управление
    • Особенности устройства и конструкции фрезерного станка с ЧПУ
    • Функциональные составляющие (подсистемы) ЧПУ
    • Языки для программирования обработки
    • Процесс фрезерования
    • Режущий инструмент
    • Вспомогательный инструмент
    • Основные определения и формулы
    • Рекомендации по фрезерованию
    • Прямоугольная система координат
    • Написание простой управляющей программы
    • Создание УП на персональном компьютере
    • Передача управляющей программы на станок
    • Проверка управляющей программы на станке
    • Советы по технике безопасности при эксплуатации станков с ЧПУ
    • Нулевая точка станка и направления перемещений
    • Нулевая точка программы и рабочая система координат
    • Компенсация длины инструмента
    • Абсолютные и относительные координаты
    • Комментарии в УП и карта наладки
    • G- и М-коды
    • Структура программы
    • Слово данных, адрес и число
    • Модальные и немодальные коды
    • Формат программы
    • Строка безопасности
    • Ускоренное перемещение – G00
    • Линейная интерполяция – G01
    • Круговая интерполяция – G02 и G03
    • Введение
    • Останов выполнения управляющей программы – М00 и М01
    • Управление вращением шпинделя – М03, М04, М05
    • Управление подачей СОЖ – М07, М08, М09
    • Автоматическая смена инструмента – М06
    • Завершение программы – М30 и М02
    • Основные принципы
    • Использование автоматической коррекции на радиус инструмента
    • Активация, подвод и отвод
    • Подпрограмма
    • Работа с осью вращения (4-ой координатой)
    • Параметрическое программирование
    • Методы программирования
    • Что такое CAD и САМ?
    • Общая схема работы с CAD/САМ-системой
    • Виды моделирования
    • Уровни САМ-системы
    • Геометрия и траектория
    • Алгоритм работы в САМ-системе и постпроцессор
    • Ассоциативность
    • Пятикоординатное фрезерование и ЗD-коррекция
    • Высокоскоростная (ВСО) и высокопроизводительная обработка
    • Критерии для оценки, сравнения и выбора CAM-систем

    Интерполяция данных: соединяем точки так, чтобы было красиво

    Как построить график по n точкам? Самое простое — отметить их маркерами на координатной сетке. Однако для наглядности их хочется соединить, чтобы получить легко читаемую линию. Соединять точки проще всего отрезками прямых. Но график-ломаная читается довольно тяжело: взгляд цепляется за углы, а не скользит вдоль линии. Да и выглядят изломы не очень красиво. Получается, что кроме ломаных нужно уметь строить и кривые. Однако тут нужно быть осторожным, чтобы не получилось вот такого:

    Немного матчасти

    Восстановление промежуточных значений функции, которая в данном случае задана таблично в виде точек P1&nbsp. &nbspPn, называется интерполяцией. Есть множество способов интерполяции, но все они могут быть сведены к тому, что надо найти n&nbsp–&nbsp1 функцию для расчёта промежуточных точек на соответствующих сегментах. При этом заданные точки обязательно должны быть вычислимы через соответствующие функции. На основе этого и может быть построен график:

    Функции fi могут быть самыми разными, но чаще всего используют полиномы некоторой степени. В этом случае итоговая интерполирующая функция (кусочно заданная на промежутках, ограниченных точками Pi) называется сплайном.

    В разных инструментах для построения графиков — редакторах и библиотеках — задача «красивой интерполяции» решена по-разному. В конце статьи будет небольшой обзор существующих вариантов. Почему в конце? Чтобы после ряда приведённых выкладок и размышлений можно было поугадывать, кто из «серьёзных ребят» какие методы использует.

    Ставим опыты

    Самый простой пример — линейная интерполяция, в которой используются полиномы первой степени, а в итоге получается ломаная, соединяющая заданные точки.
    Давайте добавим немного конкретики. Вот набор точек (взяты почти с потолка):

    0 0 20 0 45 -47 53 335 57 26 62 387 74 104 89 0 95 100 100 0 

    Результат линейной интерполяции этих точек выглядит так:

    Однако, как отмечалось выше, иногда хочется получить в итоге гладкую кривую.

    Что есть гладкость? Бытовой ответ: отсутствие острых углов. Математический: непрерывность производных. При этом в математике гладкость имеет порядок, равный номеру последней непрерывной производной, и область, на которой эта непрерывность сохраняется. То есть, если функция имеет гладкость порядка 1 на отрезке [a;&nbspb], это означает, что на [a;&nbspb] она имеет непрерывную первую производную, а вот вторая производная уже терпит разрыв в каких-то точках.
    У сплайна в контексте гладкости есть понятие дефекта. Дефект сплайна — это разность между его степенью и его гладкостью. Степень сплайна — это максимальная степень использованных в нём полиномов.
    Важно отметить, что «опасными» точками у сплайна (в которых может нарушиться гладкость) являются как раз Pi, то есть точки сочленения сегментов, в которых происходит переход от одного полинома к другому. Все остальные точки «безопасны», ведь у полинома на области его определения нет проблем с непрерывностью производных.
    Чтобы добиться гладкой интерполяции, нужно повысить степень полиномов и подобрать их коэффициенты так, чтобы в граничных точках сохранялась непрерывность производных.

    Традиционно для решения такой задачи используют полиномы третьей степени и добиваются непрерывности первой и второй производной. То, что получается, называют кубическим сплайном дефекта 1. Вот как он выглядит для наших данных:

    Кривая, действительно, гладкая. Но если предположить, что это график некоторого процесса или явления, который нужно показать заинтересованному лицу, то такой метод, скорее всего, не подходит. Проблема в ложных экстремумах. Появились они из-за слишком сильного искривления, которое было призвано обеспечить гладкость интерполяционной функции. Но зрителю такое поведение совсем не кстати, ведь он оказывается обманут относительно пиковых значений функции. А ради наглядной визуализации этих значений, собственно, всё и затевалось.
    Так что надо искать другие решения.

    Другое традиционное решение, кроме кубических сплайнов дефекта 1 — полиномы Лагранжа. Это полиномы степени n&nbsp–&nbsp1, принимающие заданные значения в заданных точках. То есть членения на сегменты здесь не происходит, вся последовательность описывается одним полиномом.
    Но вот что получается:

    Гладкость, конечно, присутствует, но наглядность пострадала так сильно, что… пожалуй, стоит поискать другие методы. На некоторых наборах данных результат выходит нормальный, но в общем случае ошибка относительно линейной интерполяции (и, соответственно, ложные экстремумы) может получаться слишком большой — из-за того, что тут всего один полином на все сегменты.

    В компьютерной графике очень широко применяются кривые Безье, представленные полиномами k-й степени.
    Они не являются интерполирующими, так как из k&nbsp+&nbsp1 точек, участвующих в построении, итоговая кривая проходит лишь через первую и последнюю. Остальные k&nbsp–&nbsp1 точек играют роль своего рода «гравитационных центров», притягивающих к себе кривую.
    Вот пример кубической кривой Безье:

    Как это можно использовать для интерполяции? На основе этих кривых тоже можно построить сплайн. То есть на каждом сегменте сплайна будет своя кривая Безье k-й степени (кстати, k&nbsp=&nbsp1 даёт линейную интерполяцию). И вопрос только в том, какое k взять и как найти k&nbsp–&nbsp1 промежуточную точку.
    Здесь бесконечно много вариантов (поскольку k ничем не ограничено), однако мы рассмотрим классический: k&nbsp=&nbsp3.
    Чтобы итоговая кривая была гладкой, нужно добиться дефекта 1 для составляемого сплайна, то есть сохранения непрерывности первой и второй производных в точках сочленения сегментов (Pi), как это делается в классическом варианте кубического сплайна.
    Решение этой задачи подробно (с исходным кодом) рассмотрено здесь.
    Вот что получится на нашем тестовом наборе:

    Стало лучше: ложные экстремумы всё ещё есть, но хотя бы не так сильно отличаются от реальных.

    Думаем и экспериментируем

    Можно попробовать ослабить условие гладкости: потребовать дефект 2, а не 1, то есть сохранить непрерывность одной только первой производной.
    Достаточное условие достижения дефекта 2 в том, что промежуточные контрольные точки кубической кривой Безье, смежные с заданной точкой интерполируемой последовательности, лежат с этой точкой на одной прямой и на одинаковом расстоянии:

    В качестве прямых, на которых лежат точки Ci&nbsp–&nbsp1 (2) , Pi и Ci (1) , целесообразно взять касательные к графику интерполируемой функции в точках Pi. Это гарантирует отсутствие ложных экстремумов, так как кривая Безье оказывается ограниченной ломаной, построенной на её контрольных точках (если эта ломаная не имеет самопересечений).

    Методом проб и ошибок эвристика для расчёта расстояния от точки интерполируемой последовательности до промежуточной контрольной получилась такой:

    Эвристика 1

    image

    Первая и последняя промежуточные контрольные точки равны первой и последней точке графика соответственно (точки C1 (1) и Cn&nbsp–&nbsp1 (2) совпадают с точками P1 и Pn соответственно).
    В этом случае получается вот такая кривая:

    Как видно, ложных экстремумов уже нет. Однако если сравнивать с линейной интерполяцией, местами ошибка очень большая. Можно сделать её ещё меньше, но тут в ход пойдут ещё более хитрые эвристики.

    К текущему варианту мы пришли, уменьшив гладкость на один порядок. Можно сделать это ещё раз: пусть сплайн будет иметь дефект 3. По факту, тем самым формально функция не будет гладкой вообще: даже первая производная может терпеть разрывы. Но если рвать её аккуратно, визуально ничего страшного не произойдёт.
    Отказываемся от требования равенства расстояний от точки Pi до точек Ci&nbsp–&nbsp1 (2) и Ci (1) , но при этом сохраняем их все лежащими на одной прямой:

    Эвристика для вычисления расстояний будет такой:

    Эвристика 2

    Расчёт l1 и l2 такой же, как в «эвристике 1».
    При этом, однако, стоит ещё проверять, не совпали ли точки Pi и Pi&nbsp+&nbsp1 по ординате, и, если совпали, полагать l1&nbsp=&nbspl2&nbsp=&nbsp0. Это защитит от «вспухания» графика на плоских отрезках (что тоже немаловажно с точки зрения правдивого отображения данных).

    Результат получается такой:

    В результате на шестом сегменте ошибка уменьшилась, а на седьмом — увеличилась: кривизна у Безье на нём оказалась больше, чем хотелось бы. Исправить ситуацию можно, принудительно уменьшив кривизну и тем самым «прижав» Безье ближе к отрезку прямой, которая соединяет граничные точки сегмента. Для этого используется следующая эвристика:

    Эвристика 3

    Если абсцисса точки пересечения касательных в точках Pi(xi,&nbspyi) и Pi&nbsp+&nbsp1(xi&nbsp+&nbsp1,&nbspyi&nbsp+&nbsp1) лежит в отрезке [xi;&nbspxi&nbsp+&nbsp1], то l1 либо l2 полагаем равным нулю. В том случае, если касательная в точке Pi направлена вверх, нулю полагаем максимальное из l1 и l2, если вниз — минимальное.

    Результат следующий:

    На этом было принято решение признать цель достигнутой.
    Может быть, кому-то пригодится код.

    А как люди-то делают?

    Обещанный обзор. Конечно, перед решением задачи мы посмотрели, кто чем может похвастаться, а уже потом начали разбираться, как сделать самим и по возможности лучше. Но вот как только сделали, не без удовольствия ещё раз прошлись по доступным инструментам и сравнили их результаты с плодами наших экспериментов. Итак, поехали.

    MS Excel

    Это очень похоже на рассмотренный выше сплайн дефекта 1, основанный на кривых Безье. Правда, в отличие от него в чистом виде, тут всего два ложных экстремума — первый и второй сегменты (у нас было четыре). Видимо, к классическому поиску промежуточных контрольных точек тут добавляются ещё какие-то эвристики. Но ото всех ложных экстремумов они не спасли.

    LibreOffice Calc

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

    Есть там ещё один тип интерполяции, который мы тут не рассматривали: B-сплайн. Но для нашей задачи он явно не подходит, так как даёт вот такой результат 🙂

    Highcharts, одна из самых популярных JS-библиотек для построения диаграмм

    Тут налицо «метод касательных» в варианте равенства расстояний от точки интерполируемой последовательности до промежуточных контрольных. Ложных экстремумов нет, зато есть сравнительно большая ошибка относительно линейной интерполяции (седьмой сегмент).

    amCharts, ещё одна популярная JS-библиотека

    Картина очень похожа на экселевскую, те же два ложных экстремума в тех же местах.

    Coreplot, самая популярная библиотека построения графиков для iOS и OS X

    Есть ложные экстремумы и видно, что используется сплайн дефекта 1 на основе Безье.
    Библиотека открытая, так что можно посмотреть в код и убедиться в этом.

    aChartEngine, вроде как самая популярная библиотека построения графиков для Android

    Больше всего похоже на кривую Безье степени n&nbsp–&nbsp1, хотя в самой библиотеке график называется «cubic line». Странно! Как бы то ни было, тут не только присутствуют ложные экстремумы, но и в принципе не выполняются условия интерполяции.

    Вместо заключения

    В конечном счёте получается, что из «больших ребят» лучше всех проблему решили Highcharts. Но метод, описанный в этой статье, обеспечивает ещё меньшую ошибку относительно линейной интерполяции.
    Вообще, заняться этим пришлось по просьбе покупателей, которые зарепортили нам «острые углы» в качестве бага в нашем движке диаграмм. Будем рады, если описанный опыт кому-то пригодится.

    • графики и диаграммы
    • визуализация данных
    • интерполяция
    • Математика
    • Визуализация данных

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *