数值方法:基于Hermite函数的函数的LS逼近

时间:2018-05-21 20:11:41

标签: matlab

enter image description here

我正在研究近似项目,我想使用Hermite作为基本功能 我使用不同的基本功能完成了第一部分和第二部分任务:enter image description here并且它完美运行。 主要问题是,当我尝试使用Hermite作为基本功能时,它无法正常工作。我不明白使用这两个基本函数有什么区别,我该怎么做才能使它适用于Hermite。它看起来像这样: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

我如何计算hermite * pre函数:

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

和hermite

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

我自己计算Cholesky-Banachiewicz的其他函数:

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 :(得分:0)

在函数calculateVal中:

   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 - > Ñ