Red de conocimiento informático - Consumibles informáticos - ¿Quién sabe que el código fuente de B-splines racionales no uniformes se realiza mejor con MATLAB? El asunto es urgente.

¿Quién sabe que el código fuente de B-splines racionales no uniformes se realiza mejor con MATLAB? El asunto es urgente.

¿Está bien? Código fuente spline.

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;

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