числовой::
Интерполяция кубическими сплайнами
Блокноты 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®.