2744557306 发表于 2023-12-31 17:40

三次样条插值

这段MATLAB代码实现了三次样条插值,将给定的函数 fg(x) 在区间 [-1, 1] 上的数据点进行插值,并在指定的新点 x1 上绘制插值结果。以下是代码的主要解释:
x = -1:0.01:1;
y1 = -50./(1+25.*x.^2).^2.*x;
n = length(x);
h(1) = x(2) - x(1);

% 计算差分商
for i = 2:n-1
    h(i) = x(i+1) - x(i);
    lm(i) = h(i) / (h(i-1) + h(i));
    mu(i) = 1 - lm(i);
    c1(i) = 3 * (lm(i)*(fg(x(i)) - fg(x(i-1))) / h(i-1) + mu(i)*(fg(x(i+1)) - fg(x(i))) / h(i));
end

c(1:n-2) = c1(2:n-1);
m(1) = y1(1);
m(n) = y1(n);
c(1) = c(1) - lm(2)*m(1);
c(n-2) = c(n-2) - mu(n-1)*m(n);

% 解三对角线性方程组
a = 2 * ones(1, n-2);
b = lm(3:n-1);
d = mu(2:n-2);
X = trisys(d, a, b, c);
m(2:n-1) = X;

% 插值计算
x1 = -0.9:0.1:0.9;
L = length(x1);
for k = 1:L
    for i = 1:n-1
        if (x1(k) >= x(i) && x1(k) <= x(i+1))
            t = (x1(k) - x(i)) / h(i);
            u1 = (1 + 2*t) * (t - 1)^2;
            u2 = t * (t - 1)^2;
            u3 = t^2 * (3 - 2*t);
            u4 = t^2 * (t - 1);
            sm(k) = fg(x(i)) * u1 + h(i) * m(i) * u2 + fg(x(i+1)) * u3 + h(i) * m(i+1) * u4;
        end
    end
end

% 绘制插值结果
plot(x, fg(x), x1, sm, 'r');
hold on;

此代码使用三次样条插值方法(Cubic Spline Interpolation)对函数 fg(x) 的数据点进行插值,然后在新点 x1 处计算插值结果并绘制。




页: [1]
查看完整版本: 三次样条插值