You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:14:12