% 向险恶的24题样条插值低头
%
% 我们来围观一下答案的长度
%
% 别慌,也就4页
%
%
% 现在我们来介绍一下如何用matlab的spline函数脱离苦海
% 函数用法参考https://ww2.mathworks.cn/help/matlab/ref/spline.html
%

clc,clear;

% 养成好习惯,全部清光光
%
%% 第一小问
% 不管三七98k我们先把插值点对准备好

x=[0.25 0.3 0.39 0.45 0.53]
y=[0.5 0.5417 0.6245 0.6708 0.7280]

% 计算插值函数,注意因为第一问有两端点初始导数边界条件,所以用[1 y 0.6868]来表示两个端点导数分别为1和0.6868

Q1_struct=spline(x,[1 y 0.6868])

% 并且返回一个结构体Q1_struct,其用法如下:
%
%
% 验证插值误差

ppval(Q1_struct,x)

% 打印多项式

Q1_struct.coefs

% 注意这个系数指的是(x-xi)^n的多项式系数。换言之，对于区间 [x1,x2] 上的系数 [a,b,c,d]，对应的多项式为
% f(x)=a(x-x_1)^3+b(x-x_1)^2+c(x-x_1)+d
%
% 画个图观察一波

xx = linspace(x(1),x(5),101);
plot(x,y,'o',xx,ppval(Q1_struct,xx),'-');

%
%% 第二小问
% 计算插值函数,注意因为第2问有两端点初始二阶导数导数边界条件,需要用更强的函数来操作,函数调用方法可以查询doc csape
% 发现可以设定conds来约束导数结果

conds='second',[0 0];
Q2_struct=csape(x,y,conds)
Q2_struct.coefs
ppval(Q2_struct,x)
plot(x,y,'o',xx,ppval(Q1_struct,xx),'r-',xx,ppval(Q2_struct,xx),'b-');
legend('point','Q1','Q2')

xlim([0.207 0.607])
ylim([0.477 0.810])

%

clc;clear;
syms x;
f=x^3-8*x+4==0
ans=solve(f,x,'MaxDegree', 3)