2014-11-07 3 views
0

Я написал этот код для своей домашней работы на MATLAB о кубической сплайновой интерполяции с трехдиагональной матрицей. Я следую всем шагам алгоритма, и я действительно не нахожу свою ошибку. Код в порядке со второстепенными функциями, но когда я ставлю, например, sin (x), результат не является сплайном и не знает, почему, потому что с другой функцией у меня нет проблем. Может ли кто-нибудь помочь мне найти ошибку? БлагодаряСплайн кубический с тридиагональной матрицей

кубического сплайна SCRIPT:

close all 
clear all 
clf reset 

ff = @(x) sin(x); 
x = [-2 0 2 4 6 7 8 9 10 11 12]; 
for i = 1: length(x), 
    omega(i) = ff(x(i)); 
end 

n = length(x); 
h = zeros(n - 1, 1); 
for i = 1: n - 1, 
    h(i) = x(i + 1) - x(i); 
end 

a = zeros(n, 1); 
b = zeros(n, 1); 
d = zeros(n, 1); 
f = zeros(n, 1); 

for j = 2: n - 1, 
    a(j) = 2*(h(j) + h(j - 1)); 
    b(j) = h(j - 1); 
    d(j) = h(j); 
    f(j) = 6 * (omega(j + 1) - omega(j)/h(j)) - (6 * (omega(j) - omega(j - 1))/h(j - 1)); 
end 

% Starting conditions 
a(1) = -2; 
f(1) = 0; 
a(n) = 4; 
f(n) = 0; 

% Coefficents 
c = tridiag(a, b, d, f); 

t = linspace (x(1), x(n), 301); 
for k = 1: length(t), 
    tk = t(k); 
    y(k) = spline_aux(x, omega, c, tk); 
    z(k) = ff(tk); 
end 

plot(t, z, 'b-', 'linewidth', 2) 
hold on; 
plot(t, y, 'r.', x, omega, 'go') 
grid on 

TRIADIAGONAL MATRIX:

function [x] = tridiag(a, b, d, f) 

n = length(f); 
alfa = zeros(n, 1); 
beta = zeros(n, 1); 

alfa(1) = a(1); 
for i = 2: n, 
    beta(i) = b(i)/alfa(i - 1); 
    fprintf (' i: %d  beta: %12.8f\n', i, beta(i)) 
    alfa(i) = a(i) - (beta(i)*d(i - 1)); 
    fprintf (' i: %d  alfa: %12.8f\n', i, alfa(i)) 
end 

y(1) = f(1); 
for i = 2: n, 
    y(i) = f(i) - beta(i)*y(i - 1); 
end 

x(n) = y(n)/alfa(n); 
for i = n - 1: 1, 
    x(i) = (y(i) - (d(i)*x(i + 1)))/alfa(i); 
end 

СПЛАЙН ОЦЕНКА В Т.К. POINT:

function [s] = spline_aux(x, w, c, tk) 

n = length(x); 

h = zeros(n - 1, 1); 
for i = 1: n - 1, 
    h(i) = x(i+1) - x(i); 
end 

for i = 1: n - 1, 
    if (x(i) <= tk && tk <= x(i+1)) 
     break 
    end 
end 

s1 = c(i)*((x(i+1) - tk)^3)/(6*h(i)); 
s2 = c(i+1)*((tk - x(i))^3)/(6*h(i)); 
s3 = (w(i)/h(i) - (c(i)*h(i)/6))*(x(i+1) - tk); 
s4 = (w(i+1)/h(i) - (c(i+1)*h(i)/6))*(tk - x(i)); 
s = s1 + s2 + s3 + s4; 
+0

Результат не сплайн? Это билет на автобус или пирог? Мой вопрос: Что вы получаете? что вы ожидаете получить? –

+0

Я не могу поместить изображение, потому что у меня низкая репутация, и я новичок на этом сайте, извините. Однако да, это не сплайн. Разрешение должно показать сплайн, и я должен сравнить его с функцией sin (x), изменяющей начальное условие, но результаты между каждой точкой, прямой, поэтому разрешение это не сплайн, и поэтому я не могу выполнить сравнение было выполнено. Я следую алгоритму, но я не понял, что пропустить для показа сплайна (без использования функции сплайна MATLAB, но используя мой spline_aux). Извините, если я не был ясен. – marks

+0

Поместите изображение где-нибудь и опубликуйте ссылку. Мы поместим изображение в сообщение –

ответ

0

Это потому, что вы не используете Matlab-х for правильно

в функции function [x] = tridiag(a, b, d, f)

последний for читает for i = n - 1: 1 но никогда не будет выполнять, вы shoudl writte:

for i = n - 1:-1:1

Затем работает. Следует заметить, что didt работу в любой из предыдущих попыток, не только грех (х)

enter image description here

+0

Я пробовал с другой функцией второго сорта, и это дает мне еще одну ошибку, и я не знаю, почему ... Funcion: ff = @ (x) 2 * x * x - 3 * x + 5; Значения X: x = [-6 -4 -2 0 2 3 5 7]; Результат: http://imageshack.com/a/img909/1052/QKU1yX.jpg – marks

+0

Извините, но я не забуду начальное состояние: a (1) = -2; f (1) = 3; a (n) = 4; f (n) = 5; – marks

+0

@marks Это совершенно другая вещь. Вы не устанавливаете гладкость между сплайнами. Вы просто этого не делаете. Вам нужно узнать больше о том, что вы делаете и как! вам нужно сформулировать сплайн-уравнение, так что первая производная в точке будет постоянной в разных соседних сплайнах. –

Смежные вопросы