Maxima 中的 cspline 给我一个结果,表明 Maxima 中有错误
cspline in Maxima giving me a result which indicates an error in Maxima
我有以下三次多项式 f(x)=x³ - 3 x² + x -5 假设以下数据,三次样条应提供完全相同的多项式:
(-1, -10), (0,-5), (1, -6) 在极值处二阶导数 f''(-1)=-12, f''(1)=0(注意 f ''(x)=6x-6.)
这是我试过的一段代码:
/* 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]]$
fpp(x) := diff(f(x),x,2);
fpp0 : at( fpp(x), [x=x0]);
fpp2 : at( fpp(x), [x=x2]);
/* here I call cspline with d1=fpp0 and dn=fpp2 */
load(interpol)$
cspline(p, d1=fpp0, dn=fpp2);
我期望原始多项式 (f(x)=x³ -3 x² + x -5) 但我得到了结果:
(%o40) (-16*x^3-15*x^2+6*x-5)*charfun2(x,-inf,0)+(8*x^3-15*x ^2+6*x-5)*charfun2(x,0,inf)
与原多项式不符。
甚至更多。这是对 Maxima 提供的结果的测试。
代码:
/* verification */
h11(x) := -16*x^3 - 15* x^2 + 6* x - 5;
h22(x) := 8* x^3 - 15*x^2 + 6* x - 5;
h11pp(x) := diff(h11(x), x, 2);
h11pp0: at( h11pp(x), [x=x0]);
h22pp(x) := diff(h22(x), x, 2);
h22pp2 : at(h22pp(x), [x=x2]);
将 66 和 18 作为边界条件,应该改为 -12 和 0。
谢谢。
您似乎误解了 d1
和 dn
与 cspline
的参数。正如 cspline
的描述所说,d1
和 dn
指定端点处样条的一阶导数,而不是二阶导数。
当我使用 f
的一阶导数指定 d1
和 dn
的值时,我得到了预期的结果:
(%i2) f(x) := x^3 - 3* x^2 + x - 5$
(%i3) [x0, x1, x2]: [-1, 0, 1] $
(%i4) [y0, y1, y2]: map (f, %);
(%o4) [- 10, - 5, - 6]
(%i5) p: [[x0, y0], [x1, y1], [x2, y2]];
(%o5) [[- 1, - 10], [0, - 5], [1, - 6]]
(%i6) load (interpol) $
(%i7) cspline (p, d1 = at(diff(f(x), x), x=x0), dn = at(diff(f(x), x), x=x2));
3 2
(%o7) (x - 3 x + x - 5) charfun2(x, minf, 0)
3 2
+ (x - 3 x + x - 5) charfun2(x, 0, inf)
我有以下三次多项式 f(x)=x³ - 3 x² + x -5 假设以下数据,三次样条应提供完全相同的多项式: (-1, -10), (0,-5), (1, -6) 在极值处二阶导数 f''(-1)=-12, f''(1)=0(注意 f ''(x)=6x-6.)
这是我试过的一段代码:
/* 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]]$
fpp(x) := diff(f(x),x,2);
fpp0 : at( fpp(x), [x=x0]);
fpp2 : at( fpp(x), [x=x2]);
/* here I call cspline with d1=fpp0 and dn=fpp2 */
load(interpol)$
cspline(p, d1=fpp0, dn=fpp2);
我期望原始多项式 (f(x)=x³ -3 x² + x -5) 但我得到了结果:
(%o40) (-16*x^3-15*x^2+6*x-5)*charfun2(x,-inf,0)+(8*x^3-15*x ^2+6*x-5)*charfun2(x,0,inf)
与原多项式不符。
甚至更多。这是对 Maxima 提供的结果的测试。 代码:
/* verification */
h11(x) := -16*x^3 - 15* x^2 + 6* x - 5;
h22(x) := 8* x^3 - 15*x^2 + 6* x - 5;
h11pp(x) := diff(h11(x), x, 2);
h11pp0: at( h11pp(x), [x=x0]);
h22pp(x) := diff(h22(x), x, 2);
h22pp2 : at(h22pp(x), [x=x2]);
将 66 和 18 作为边界条件,应该改为 -12 和 0。
谢谢。
您似乎误解了 d1
和 dn
与 cspline
的参数。正如 cspline
的描述所说,d1
和 dn
指定端点处样条的一阶导数,而不是二阶导数。
当我使用 f
的一阶导数指定 d1
和 dn
的值时,我得到了预期的结果:
(%i2) f(x) := x^3 - 3* x^2 + x - 5$
(%i3) [x0, x1, x2]: [-1, 0, 1] $
(%i4) [y0, y1, y2]: map (f, %);
(%o4) [- 10, - 5, - 6]
(%i5) p: [[x0, y0], [x1, y1], [x2, y2]];
(%o5) [[- 1, - 10], [0, - 5], [1, - 6]]
(%i6) load (interpol) $
(%i7) cspline (p, d1 = at(diff(f(x), x), x=x0), dn = at(diff(f(x), x), x=x2));
3 2
(%o7) (x - 3 x + x - 5) charfun2(x, minf, 0)
3 2
+ (x - 3 x + x - 5) charfun2(x, 0, inf)