Maxima中cspline未生成预期三次多项式的技术问题问询
问题分析与解决:Maxima三次样条与原多项式不符的问题
首先,你遇到的问题核心是对Maxima中cspline函数的参数理解有误——d1和dn参数指定的是端点的一阶导数,而非你以为的二阶导数!这就是导致结果偏离原多项式的根本原因。
问题根源拆解
你定义的原多项式是:
f(x) := x^3 - 3* x^2 + x - 5$
对应的端点一阶导数应该是:
fp(x) := diff(f(x), x); fp0 : at(fp(x), x=-1); /* 计算得 3*(-1)^2 -6*(-1)+1 = 3+6+1=10 */ fp2 : at(fp(x), x=1); /* 3*(1)^2 -6*(1)+1=3-6+1=-2 */
而你之前错误地传入了二阶导数fpp0=-12和fpp2=0,完全不符合cspline的参数要求,自然得不到正确的样条结果。
修正后的代码实现
把参数换成正确的一阶导数,重新运行:
/* polynomial to interpolate and data */ f(x) := x^3 - 3* x^2 + x - 5$ x0:-1$ x1:0$ x2:1$ y0:f(x0)$ y1:f(x1)$ y2:f(x2)$ p:[[x0,y0],[x1,y1],[x2,y2]]$ /* 计算端点一阶导数 */ fp(x) := diff(f(x), x); fp0 : at(fp(x), x=x0); fp2 : at(fp(x), x=x2); /* 加载插值库并调用cspline,传入正确的一阶导数参数 */ load(interpol)$ cspline(p, d1=fp0, dn=fp2);
结果验证
运行修正后的代码,得到的分段函数每一段都会和原多项式完全一致:
(%o...) (x^3 - 3*x^2 + x - 5)*charfun2(x,-inf,0)+(x^3 - 3*x^2 + x - 5)*charfun2(x,0,inf)
你可以进一步验证分段函数的二阶导数:
h(x) := x^3 - 3*x^2 + x -5; hpp(x) := diff(h(x),x,2); at(hpp(x),x=-1); /* 得到-12,符合预期 */ at(hpp(x),x=1); /* 得到0,符合预期 */
备选方案:直接指定二阶导数构造样条
如果你确实需要通过指定二阶导数来构造三次样条,Maxima的interpol库中还有cspline2函数,它接受d2a和d2b参数来指定端点的二阶导数。用这个函数的话,你原来的二阶导数值就可以直接传入:
cspline2(p, d2a=fpp0, d2b=fpp2);
运行这个也会得到和原多项式一致的结果。
内容的提问来源于stack exchange,提问作者Herman Jaramillo
相关产品推荐
相关产品推荐

