clear; clc;
syms t

% 输入参数：
% f：被逼近的函数（符号表达式）
% w：权函数（符号表达式）
% n：勒让德多项式的阶数（最佳平方逼近的次数）
f = sin(pi*t);  % 示例：被逼近函数
w = 1;          % 示例：权函数（此处为1，即普通最佳平方逼近）
n = 2;          % 示例：逼近多项式阶数


sumsf = zeros(1, n+1);
sn = zeros(1, n+1);
Pnx = sym(zeros(1, n+1));

for i = 1 : n+1
    Pn0 = 2^(-(i-1)) / factorial(i-1) * (t^2 - 1)^(i-1);
    Pnx(i) = diff(Pn0, i-1);
    sumsf(i) = int(w * f * Pnx(i), -1, 1);
    sn(i) = 2 / (2*(i-1) + 1);
end

digits(5);
fintP = vpa(sumsf);
axk = fintP ./ sn;
Snx = simplify(Pnx * axk');
Sqa_err = abs(vpa(int(f*f, -1, 1)) - sn * (axk').^2) ^ 0.5;

% 输出结果：
% fintP：函数f与各阶勒让德多项式的内积（带权）
% axk：最佳平方逼近的系数
% Snx：最佳平方逼近多项式（符号形式）
% Sqa_err：平方逼近误差
fintP, axk, Snx, Sqa_err