Você está na página 1de 3

Exemplo: Ajustar uma curva spline para os pontos abaixo:

x 3 4,5 7 9
y 2,5 1 2,5 0,5

(𝑛 − 1) = 3 𝑐𝑢𝑟𝑣𝑎𝑠 𝑠𝑝𝑙𝑖𝑛𝑒𝑠
4 𝑝𝑜𝑛𝑡𝑜𝑠 ⇒ { 𝑚𝑎𝑡𝑟𝑖𝑧 𝑑𝑜𝑠 𝑐𝑜𝑒𝑓𝑖𝑐𝑖𝑒𝑛𝑡𝑒𝑠 𝑐 𝑑𝑒 𝑜𝑟𝑑𝑒𝑚 4𝑥4
𝑘 = 2 𝑒 3 (𝑘 = 2,3, … , 𝑛 − 1)

 𝑘 = 2:

𝑓3 − 𝑓2 𝑓2 − 𝑓1
3( )− 3( ) = ℎ1 𝑐1 + 2(ℎ1 + ℎ2 )𝑐2 + ℎ2 𝑐3
ℎ2 ℎ1

 𝑘 = 3:

𝑓4 − 𝑓3 𝑓3 − 𝑓2
3( ) − 3( ) = ℎ2 𝑐2 + 2(ℎ2 + ℎ3 )𝑐3 + ℎ3 𝑐4
ℎ3 ℎ2

Lembrando que:

𝑐1 = 0
{
𝑐4 = 0

Matriz dos coeficientes c:

0
1 0 0 0 𝑐1 𝑓3 − 𝑓2 𝑓2 − 𝑓1
3( ) − 3( )
ℎ1 2(ℎ1 + ℎ2 ) ℎ2 0 𝑐2 ℎ2 ℎ1
[ ] [𝑐 ] =
0 ℎ2 2(ℎ2 + ℎ3 ) ℎ3 3 𝑓4 − 𝑓3 𝑓3 − 𝑓2
𝑐 3( ) − 3( )
0 0 0 1 4 ℎ3 ℎ2
[ 0 ]

Calculando ℎ𝑖 :

ℎ1 = 𝑥2 − 𝑥1 = 1,5
{ℎ2 = 𝑥3 − 𝑥2 = 2,5
ℎ3 = 𝑥4 − 𝑥3 = 2,0

Substituindo:

1 0 0 0 𝑐1 0
1,5 8 2,5 0 𝑐2 4,8
[ ][ ] = [ ]
0 2,5 9 2 𝑐3 −4,8
0 0 0 1 𝑐4 0

0
0,8395
𝑐𝑖 = [ ]
−0,7665
0

𝑐𝑖+1 − 𝑐𝑖 𝑑1 = 0,1866
𝑑𝑖 = ⇒ {𝑑2 = −0,2141
3ℎ𝑖
𝑑3 = 0,1278
𝑓𝑖+1 − 𝑓𝑖 𝑐𝑖+1 + 2𝑐𝑖 𝑏1 = −1,4198
𝑏𝑖 = −( ) ℎ𝑖 ⇒ {𝑏2 = −0,1605
ℎ𝑖 3
𝑏3 = 0,0221

𝑠𝑖 (𝑥) = 𝑓𝑖 + 𝑏𝑖 (𝑥 − 𝑥𝑖 ) + 𝑐𝑖 (𝑥 − 𝑥𝑖 )2 + 𝑑𝑖 (𝑥 − 𝑥𝑖 )3

2,5 − 1,4198(𝑥 − 𝑥𝑖 ) + 0,1866(𝑥 − 𝑥𝑖 )3


𝑠𝑖 (𝑥) = { 1 − 0,1605(𝑥 − 𝑥𝑖 ) + 0,8395(𝑥 − 𝑥𝑖 )2 − 0,2141(𝑥 − 𝑥𝑖 )3
2,5 + 0,0221(𝑥 − 𝑥𝑖 ) − 0,7665(𝑥 − 𝑥𝑖 )2 + 0,1278(𝑥 − 𝑥𝑖 )3

Obs. A matriz dos coeficientes é tridiagonal, com lei de formação bem característica:

𝐷𝑖𝑎𝑔𝑜𝑛𝑎𝑙 𝑎𝑐𝑖𝑚𝑎 𝑑𝑎 𝑝𝑟𝑖𝑛𝑐𝑖𝑝𝑎𝑙: 0, ℎ1 , ℎ2 , … , ℎ𝑛−1 , 0


{𝐷𝑖𝑎𝑔𝑜𝑛𝑎𝑙 𝑝𝑟𝑖𝑛𝑐𝑖𝑝𝑎𝑙: 1, 2(ℎ1 + ℎ2 ), 2(ℎ2 + ℎ3 ), … , 2(ℎ𝑛−2 + ℎ𝑛−1 ), 1
𝐷𝑖𝑎𝑔𝑜𝑛𝑎𝑙 𝑎𝑏𝑎𝑖𝑥𝑜 𝑑𝑎 𝑝𝑟𝑖𝑛𝑐𝑖𝑝𝑎𝑙: ℎ1 , ℎ2 , … , ℎ𝑛−1 , 0

Exercício: Criar um programa para ajustar uma spline com uma quantidade qualquer de pontos.
Plotar o gráfico da curva e comparar com uma polyfit.

% Programa Spline cúbica

clear all

v = [3 2.5;4.5 1;7 2.5;9 0.5];

x = v(:,1);
y = v(:,2);
n = length(v);
A = zeros(n);

% Primeiro e último elemento da matriz iguais a 1


A(1,1)=1;
A(n,n)=1;

for i=1:(n-1)
h(i) = x(i+1)-x(i); % Criando os h's
end

for i=2:(n-1)
A(i,i-1) = h(i-1); % Criando sub diagonal principal
A(i,i+1) = h(i); % Criando diagonal acima da principal
A(i,i) = 2*(A(i,i-1)+A(i,i+1)); % Criando diagonal abaixo da
principal
end

a = zeros(n,1);

for i=2:(n-1)
a(i) = 3*((y(i+1)-y(i))/h(i)) - 3*((y(i)-y(i-1))/h(i-1));
end

c = A\a; % Coeficientes c

for i=1:(n-1)
d(i) = (c(i+1)-c(i))/(3*h(i));
b(i) = (y(i+1)-y(i))/h(i) - (c(i+1)+2*c(i))*(h(i)/3);
end

t = zeros(n-1,100);
s = zeros(n-1,100);

for i=1:(n-1)
t(i,:) = linspace(x(i),x(i+1));
s(i,:) = y(i)+b(i).*(t(i,:)-x(i))+c(i).*(t(i,:)-
x(i)).^2+d(i).*(t(i,:)-x(i)).^3;
plot(t(i,:),s(i,:),'b') % Curva spline
hold on
end

plot(x,y,'ro') % Pontos discretos

p = polyfit(x,y,5);
xx=linspace(x(1),x(end));
pol=polyval(p,xx);
plot(xx,pol,'-g') % Curva polinomial
legend('Spline','Pontos','Polinomial')

Você também pode gostar