Численные методы: Л.С. Аппроксимация функции на основе функций Эрмита - PullRequest
0 голосов
/ 21 мая 2018

enter image description here

Я работаю над проектом аппроксимации и хочу использовать Hermite в качестве базовой функции. Я выполнил первую часть и вторую задачу, используя разныеБазовая функция: enter image description here и работает отлично.Основная проблема заключается в том, что когда я пытаюсь использовать Hermite в качестве базовой функции, она не работает должным образом.Я не понимаю, в чем разница, используя эти 2 базовые функции, и что я должен сделать, чтобы это работало для Эрмита.Это выглядит так: enter image description here

Это должно выглядеть примерно так: enter image description here

Вот моя основная логика:

clear
clc
close all

%current main loop for N = 5,10,15 and different values of k
x=linspace(-1,1,1001);
yx=linspace(-1,1,1001);
figure
for N = 1:15
    if (N == 5 || N == 10 || N == 15)
        for k = 1:N
            clf;
            for i = 1:1001
                yx(i) = f(x(i));
            end
            plot(x,yx);
            for i = 1:N
                hold on;
                j = -1+2*(i-1)/(N-1);
                l = f(j);
                plot(j,l,'r*');
            end
            p=findCoeficients(k,N);
            for i = 1:size(x,2)
                y(i) = calculateVal(p,x(i),N);
            end
            plot(x,y);
            title("n "+N+",k "+k);
            pause(.25);
        end
    end
end

Вот как я нахожу коэффициенты p:

function[p] = findCoeficients(k,N)
x=linspace(-1,1,N);
Y=zeros(N,1);
Fi=zeros(N,k);
for i = 1:N
    Y(i,1) = f(x(i));
    for j = 1:k
        Fi(i,j) = hermite(-1+2*(i-1)/(N-1),j);
    end
end
p = CB((transpose(Fi)*Fi),transpose(Fi)*Y);
end

Функция из Задачи 1:

function[y] = f(x)
y = cos(pi*x)*exp(x);
end

Создание приблизительного значения:

function[y] = calculateVal(p,a,k)
y=0;
for i=1:size(p)
    y = y+p(i,1)* hermite(a,k);
end
end

Как рассчитать Эрмита * Предварительная функция:

function[h] = hermite(x,k)
h = hermitePar(k,x)*exp(-(x^2));
end

И Эрмита

function[h] = hermitePar(k,x)
if (k>1)
    h = (2*x*hermitePar(k-1,x)) - ((2*k-2)*hermitePar(k-2,x));
elseif (k==1)
    h = x;%2*x;
elseif (k==0)
    h =1;
end
end

Остальные функции для расчета Холецкого-Банахевича самостоятельно:

function[L] = cholesky(A)
n = length( A );
L = zeros( n, n );
for i=1:n
    L(i, i) = sqrt(A(i, i) - L(i, :)*L(i, :)');
    for j=(i + 1):n
        L(j, i) = (A(j, i) - L(i,:)*L(j ,:)')/L(i, i);
    end
end
end

function[A] = CB(A,B)
%A = backwardSubs
c = cholesky(A);
fSubs = lower(c, B);
A = upper(c.', fSubs);
end

function[x] = lower(A,b)
n=length(A);
x=zeros(n,1);
for i = 1 : n
    x(i) = b(i);
    for j = 1 : i - 1
        x(i) = x(i) - A(i, j) * x(j);
    end

    x(i) = x(i)/A(i, i);
end
end

function[x] = upper(A, b)
n=length(A);
x=zeros(n, 1);
for i=n:-1:1
    x(i)=b(i)/A(i, i);
    b(1:i-1)=b(1:i-1)-A(1:i-1, i)*x(i);
end
end

1 Ответ

0 голосов
/ 21 мая 2018

В функции CalcualVal:

   function[y] = calculateVal(p,a,k)
    y=0;
    for i=1:size(p)
        y = y+p(i,1)* hermite(a,k);
    end
    end

в этой строке я должен использовать:

y = y+p(i,1)* hermite(a,i);

, потому что я должен взять маленькое k вместо большого K -> N

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...