числовой::Интерполяция кубическими сплайнами
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
numeric::cubicSpline([x0, y0], [x1, y1], …, <BoundaryCondition>, <Symbolic>, <NoWarning>) numeric::cubicSpline([x0, x1, …],[y0, y1, …], <BoundaryCondition>, <Symbolic>, <NoWarning>) numeric::cubicSpline([[x0, x1, …], [y0, y1, …]], <BoundaryCondition>, <Symbolic>, <NoWarning>)
numeric::cubicSpline([x0, y0], [x1, y1], …) возвращает кубическую функцию сплайна интерполяция последовательности координатных пар [x i, y i].
Вызов S := numeric::cubicSpline([x0, y0], …, [xn, yn]) приводит к кубической функции сплайна S, интерполирующий данные [x 0, y 0], …, [x n, y n], т.е. S (x i) = y i для i = 0, …, n. Функция сплайна является кусочным полиномом степени ≤ 3 на интервалах
. S и его первые две производные
непрерывны в точках x 1, …, x n - 1. Обратите внимание на то, что S расширяет полиномиальное представление на
,
к
и
, соответственно.
По умолчанию граничные условия NotAKnot приняты, т.е. третья производная
непрерывна в точках x 1 и x n - 1. С этим граничным условием S является кубическим полиномом на интервалах
и
.
По умолчанию все входные данные преобразованы в числа с плавающей запятой. Это преобразование может быть подавлено опцией Symbolic.
Без опции Symbolic абсциссы x i должен быть числовыми действительными значениями в порядке возрастания. Если эти данные не упорядочены, то numeric::cubicSpline переупорядочивает абсциссы внутренне, выдавая предупреждение. Предупреждение может быть выключено опцией NoWarning.
Функциональный S, возвращенный numeric::cubicSpline, может быть вызван один, два или три аргумента:
S(z) вызова возвращает явное выражение или номер, если z является вещественным числом. В противном случае на символьный звонок S(z) отвечают.
Вызов S(z, [k]) с неотрицательным целочисленным k возвращает k-th производная S. Cf. Пример 4. Для k> 3, нуль возвращен для любого z.
Вызов S(z, i) предназначается для символьных аргументов z. Аргумент i должен быть целым числом. Внутренне, z принят, чтобы удовлетворить x i ≤ z <x i + 1, и S(z, i) возвращает многочленное выражение в z, представляющем функцию сплайна на этом интервале.
Вызов S(z, i, [k]) с целочисленным i и неотрицательным целочисленным k возвращает полиномиальное представление k-th производная функции сплайна на интервале x i ≤ z <x i + 1.
Если S сгенерирован с символьными абсциссами x i (обязательно использующий опцию Symbolic), то вызов S(z) с числовым z приводит к ошибке. Вызов S(z, i) должен использоваться для символьных абсцисс!
Обратите внимание на то, что интерполяция 2 точек (x 0, y 0), (x 1, y 1) должна быть задана numeric::cubicSpline( [x0, y0] , [x1, y1] ), не numeric::cubicSpline( [x0, x1] , [y0, y1] )!
Мы демонстрируем некоторые вызовы с числовыми входными данными:
data := [i, sin(i*PI/20)] $ i= 0..40: S1 := numeric::cubicSpline(data): S2 := numeric::cubicSpline(data, Natural): S3 := numeric::cubicSpline(data, Periodic): S4 := numeric::cubicSpline(data, Complete = [3, PI]):
В абсциссах воспроизводятся соответствующие входные данные:
float(data[6][2]), S1(5), S2(5), S3(5), S4(5)
![]()
![]()
Интерполяция между абсциссами зависит от граничного условия:
S1(4.5), S2(4.5), S3(4.5), S4(4.5)
![]()
Это кубические полиномы в z, задающем сплайн на интервале x 0 = 0 ≤ z <x 1 = 1:
expand(S1(z, 0)); expand(S2(z, 0)); expand(S3(z, 0)); expand(S4(z, 0))
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
delete data, S1, S2, S3, S4:
Мы демонстрируем некоторые вызовы с символьными данными:
S := numeric::cubicSpline([i, y.i] $ i = 0..3):
S(1/2)
![]()
Это - кубический полином в z, задающем сплайн на интервале x 0 = 0 ≤ z <x 1 = 1:
S(z, 0)

С опцией Symbolic используется точная арифметика:
S := numeric::cubicSpline([i, y.i] $ i = 0..3, Symbolic):
S(1/2)
![]()
Также символьные граничные условия приняты:
S := numeric::cubicSpline([i, exp(i)] $ i = 0..10,
Complete = [a, b]):S(0.1)
![]()
S := numeric::cubicSpline([0, y0], [1, y1], [2, y2],
Symbolic, Complete = [a, 5]):collect(S(z, 0), z)
![]()
![]()
delete S:
Мы демонстрируем использование символьных абсцисс. Здесь опция Symbolic обязательна.
S := numeric::cubicSpline([x.i, y.i] $ i = 0..2, Symbolic):
Функция сплайна S может только быть вызвана с 2 аргументами. Это - кубический полином в z, задающем сплайн на интервале x 0 ≤ z <x 1:
S(z, 0)


delete S:
Мы строим функцию сплайна вместе с ее первыми тремя производными. Сплайн аппроксимирует функциональный sin (x):
n := 10:
x := array(0..n, [i/n*2*PI $ i = 0..n]):
S := numeric::cubicSpline([x[i], sin(x[i])] $ i = 0..n, Natural):
delete x:
plot(
plot::Function2d(S(x), x = 0..2*PI, Color = RGB::Black),
plot::Function2d(S(x, [1]), x = 0..2*PI, Color = RGB::Red),
plot::Function2d(S(x, [2]), x = 0..2*PI, Color = RGB::Green,
Mesh = 1000),
plot::Function2d(S(x, [3]), x = 0..2*PI, Color = RGB::Blue,
Mesh = 1000)
)
delete n, S:
Мы демонстрируем, как сгенерировать график фазы дифференциального уравнения
с начальными условиями
. Во-первых, мы используем numeric::odesolve, чтобы вычислить числовую сетку точек решения
с n + 1 равноотстоящий узел времени t 0, …, t n в интервале [0, 20]:
DIGITS := 4: n := 100: for i from 0 to n do t[i] := 20/n*i: end_for: f := (t, x) -> [x[2], sin(t) - x[1]^3]: x[0] := 0: y[0] := 0: for i from 1 to n do [x[i], y[i]] := numeric::odesolve(t[i-1]..t[i], f, [x[i-1], y[i-1]]): end_for:
Сетка
графика фазы состоит из следующих моментов:
Plotpoints := [[x[i], y[i]] $ i = 0..n]:
Мы хотим соединить эти точки сплайновой кривой. Мы задаем сплайн меж-Польша Sx (t), аппроксимирующий решение x (t) путем интерполяции данных [t 0, x 0], …, [t n, x n]. Сплайн меж-Польша Sy (t) приближение
получен путем интерполяции данных [t 0, y 0], …, [t n, y n]:
Sx := numeric::cubicSpline([t[i], x[i]] $ i = 0..n): Sy := numeric::cubicSpline([t[i], y[i]] $ i = 0..n):
Наконец, мы строим точки mesh вместе со сплайновой кривой интерполяции:
plot(
plot::PointList2d(Plotpoints, PointColor = RGB::Black),
plot::Curve2d([Sx(z), Sy(z)], z = 0..20, Mesh = 5*(n - 1) + 1,
LineColor = RGB::Red)
)
Функции plot::Ode2d и plot::Ode3d служат для отображения числовых решений ОДУ. На самом деле они реализованы, как обозначено предыдущими командами. Следующий вызов производит тот же график:
plot(plot::Ode2d( [t[i] $ i = 0..n], f, [x[0], y[0]], [(t, x) -> [x[1], x[2]], Style = Points, Color = RGB::Black], [(t, x) -> [x[1], x[2]], Style = Splines, Color = RGB::Red])):

delete DIGITS, n, i, t, f, x, y, Plotpoints, Sx, Sy:
|
Числовые действительные значения в порядке возрастания |
|
Произвольные выражения |
|
Тип граничного условия: или |
|
При использовании этой опции не происходит никакое преобразование входных данных к числам с плавающей точкой. Приняты символьные абсциссы x i. Упорядоченное расположение x 0 <x 1 <… <x n принято |
|
x - значения точек интерполяции должны быть в порядке возрастания. Если входные данные нарушают это условие, стандартная программа выдает предупреждение и переупорядочивает данные автоматически. При использовании этой опции выключено предупреждение. |
|
С граничным условием по умолчанию |
|
Граничное условие |
|
Граничное условие |
|
Опция, заданная как Граничное условие |
Сплайн меж-Польша: процедура MuPAD®.