¿Quién sabe que el código fuente de B-splines racionales no uniformes se realiza mejor con MATLAB? El asunto es urgente.
Salida de función = spline(x, y, xx)
Interpolación de datos spline cúbicos.
YY = SPLINE(X, Y, XX) utiliza interpolación spline cúbica para calcular los valores de YY
La función base Y en los puntos del vector XX. El vector X
especifica el punto de los datos dados Y. Si Y es una matriz, entonces
Los datos se tratan como valores vectoriales y se realiza una interpolación sobre ellos
Cada columna de Y e YY será Longitud(XX) - Dimensión (Y,2).
PP = SPLINE(X, Y) produce la forma polinómica por partes del spline cúbico
Interpolación para uso futuro con PPVAL y funciones spline Usado junto con programa UNMKPP.
Normalmente, se utilizan condiciones de extremo sin nudo. Sin embargo, si Y contiene
2 valores más que X tiene entradas, entonces el primer y el último valor en Y se utilizan como las pendientes del punto final de la spline cúbica. Es decir:
f(X) = Y(:, 2: end-1), df(min(X)) = Y(:, 1), df(max(X)) = Y ( :, fin)
Ejemplo:
Esto genera una sinusoide y luego muestrea la spline en una malla más fina:
xx );
plot(x, y, 'o', xx, yy)
Ejemplo:
Esto ilustra el uso de interpolación spline fija o completa, donde
especifica la pendiente final. Pendiente cero al final de la curva interpolada
Forzar una distribución específica de valores:
06 0]
cs = spline(x, [0y). 0]);
xx = linspace(-4, 4, 101);
plot(x, y, 'o', xx, ppval(cs, xx), ' -');
Ver INTERP1, PPVAL, SPLINES (caja de herramientas spline).
Carl de Boer Febrero 786
Copyright 1984-2002 The MathWorks, Inc.
$Revisión: 5.18 $$Fecha: 2002 /06/06 13: 39:51$.
Genere interpolación spline cúbica en ppform, dependiendo del
número de puntos de datos (generalmente usando una condición final sin nudo).
output = [];
n = length(x);
if n lt2, error('Debe haber al menos dos puntos de datos.' ) , end
Si existe (diff(x) lt; 0), [x, ind] = sort(x); en caso contrario, ind = 1: n
x; = x(:); dx = diff(x);
Si all(dx)==0, error ('Las abscisas de los datos deben ser diferentes.'), fin
[ yd,yn]= size(y); Si Y resulta ser una matriz de columnas, cámbiela a
la matriz de filas esperada.
Si yn==1, entonces yn = ydy = forma(y, 1, yn = 1; fin
Si yn==n
nota nudo = 1;
elseif yn==n 2
nota nudo = 0; endlopes = y(:, [1 n 2]). ;y(:,[1n 2])=[];
Otro
Error ('La longitud de los vectores de abscisas y ordenadas debe ser la misma.')
Fin
yi=y(:, ind). ;dd = unos(1,yd);
dx = diff(x); divdif = diff(yi). /dx(:, DD);
Si n==2
Si no hay nodos, la interpolación de 90 es una línea recta
pp= mkpp(x. ',[divdif.'yi(1,)],yd);
De lo contrario, la interpolación es un polinomio hermitiano cúbico
div dif 2 = diff([end pendientes (1,); divdif pendiente final (2,)). /dx([1 1],DD);
pp = mkpp(x,...
[(diff(divdif2))./dx(1,dd)) . ([2-1]*divdif2). '...
Duanpo(1,). 'Easy (1, :)'], yd);
Fin
elseif n = = 3 amp Noether nudo, la interpolación es una parábola
yi (2:3,)= divdif
yi(3,)= diff(div dif)/(x(3)-x(1));
yi( 2, )=yi(2,)-yi(3,)* dx(1);
pp = mkpp([x(1),x(3)],yi([3^2 1] , :). , yd);
else Crea un sistema lineal tridiagonal disperso para la pendiente en X.
b = cero(n, yd);
b(2:n-1,)=3*(dx(2:n-1,dd).*divdif( 1:n-2,) dx(1:n-2,dd). *divdif(2:n-1,);
Si no hay nudo
x 31 = x (3)-x(1);xn = x(n)-x(n-2);
b(1,:)=((dx(1) 2*x31)* dx( 2)*divdif(1,:) dx(1)^2*divdif(2,:))/x31;
b(n,=)...
( dx(n-1)^2*divdif(n-2,:) (2*xn dx(n-1))*dx(n-2)*divdif(n-1,:))/xn; p>
Otros
x 31 = 0; xn = 0; b([1 n], :) = dx([2 n-2], dd).
*Duanpo;
Fin
c = spdiags([[dx(2:n-1);xn;0]...
[dx ( 2);2 *[dx(2:n-1) dx(1:n-2)];dx(n-2)]...
[0;x 31;dx( 1 : n-2)], [-1 0 1], n, n);
Solución dispersa de ecuación lineal para pendiente
mmdflag = sp parms(' autommd ') ;
spparms('autommd ', 0);
s = c \ b
spparms('autommd ', mmdflag);
Convertir a formato pp
c4=(s(1:n-1,) s(2:n,)-2*divdif(1:n-1,)./dx(: , DD );
c3=(divdif(1:n-1,)-s(1:n-1,)./dx(:,DD)-C4;
pp =mkpp(x. ',...
Reformar((c4./dx(:,dd)).c3,"s(1:n-1,).'Yi( 1: n -1, :)'], ...
(n-1)*yd, 4), yd);
Fin
if nargin= =2
Salida = pp
Otro
salida=ppval(pp, xx);
Fin