clear; clc;

% 输入参数：
% vec_x：已知数据点的x坐标（行向量）
% vec_y：已知数据点的y坐标（行向量，与vec_x长度相同）
% y01：左端点（vec_x(1)）的一阶导数
% yn1：右端点（vec_x(end)）的一阶导数
vec_x = [1, 2, 3, 4];  % 示例x坐标
vec_y = [1, 4, 9, 16]; % 示例y坐标
y01 = 2;               % 左端点一阶导数
yn1 = 8;               % 右端点一阶导数


[m, n] = size(vec_x);
h = zeros(1, n - 1);
h(1) = vec_x(2) - vec_x(1);
miu = zeros(1, n);
lambt = zeros(1, n);
MatrMomem = zeros(n);
d = zeros(1, n);

for j = 2 : n - 1
    h(j) = vec_x(j + 1) - vec_x(j);
    miu(j) = h(j - 1) / (h(j - 1) + h(j));
    lambt(j) = 1 - miu(j);
    d(j) = 6 * ((vec_y(j + 1) - vec_y(j)) / h(j) - (vec_y(j) - vec_y(j - 1)) / h(j - 1)) / (h(j - 1) + h(j));
    MatrMomem(j, j - 1 : j + 1) = [miu(j), 2, lambt(j)];
end

d(1) = 6 * ((vec_y(2) - vec_y(1)) / h(1) - y01) / h(1);
d(n) = 6 * (yn1 - (vec_y(n) - vec_y(n - 1)) / h(n - 1)) / h(n - 1);

MatrMomem(1, 1 : 2) = [2, 1];
MatrMomem(n, n - 1 : n) = [1, 2];
M = MatrMomem \ d';

% 输出结果：
% MatrMomem：三弯矩法的系数矩阵
% d：三弯矩法方程组的右端项向量
% M：求解得到的弯矩向量
MatrMomem, d, M
