@Craige_Hales和@米图尔沙赫,
我对贝塞尔曲线的了解和经验有限。 我已经看到它们在绘图(建筑和景观美化)设计和服装设计中的实用性。 当然,数学基础对我来说总是很有趣。我在互联网上查了一下,发现@米图尔沙赫求Excel的贝塞尔样条,B样条,算法是比较常见的一种。 一个链接Excel平滑算法问题包含 zip 文件的链接: http://xlrotor.com/Smooth_curve_bezier_example_file.zip该 zip 包含一个 2002 .xls 贝塞尔曲线示例,其中嵌入了自动化例程,用于从 Excel 平滑曲线中抓取像素并在曲线上插入点。它并不“精确”,并且使用了从曲线上抓取 4 个像素的技术。 端点在第一个插值点和最后一个插值点中使用两次。
在 Craige 发表有关 GraphBuilder Line 元素选项使其成为曲线的帖子后,我发现 JMP 中使用的样条线必须使用不同的算法,因为端点斜率与 Excel 的非常相似。我启动了一个脚本,通过提取 GB 图的像素来执行一些 DSP(数字信号处理)。 然后我找到了上面列出的网络链接,并决定仅使用 Excel 电子表格中的插值点并将其与 GB 线(曲线)覆盖。 下面的第一个屏幕截图描绘了 Excel 工作表,其中包含带有贝塞尔样条线和插值点的 Excel 图形,这些点作为旋转 B 点添加到 JMP 表中。第二张图显示了叠加了 Excel 插值点的 JMP GB 线(曲线)。
Excel Interpolated Points > Spin B in JMP tableExcel Interpolated Points > Spin B in JMP tableExcel 插值点 > JMP 表中的旋转 B
JMP Line(curve) spline overlaid with Excel interpolationsJMP Line(curve) spline overlaid with Excel interpolations与 Excel 插值叠加的 JMP 线(曲线)样条线
您会注意到插值与上尾部的 JMP 线(曲线)略有偏移,这可能是由于插值算法、Excel 和 JMP 曲线的差异或两者的组合造成的。 请注意,这 4 个点略高于 Excel 图表中的曲线。
因此,我的结论是 JMP GB 线(曲线)样条线与 Excel 贝塞尔曲线非常相似。我的兴趣不高,但如果我感到无聊,我可能会完成我的 DSP 脚本来“获取”直线(曲线)点。早期版本的 JMP 用于报告保存的 .jrn 文件中的曲线点,现在 .jrn 文件中仅引用隐藏函数。
现在,如果我就这个问题进行咨询,我的第一组问题将是:
- 这些数据(4分)从何而来,目标是什么?
- 样条曲线与直线和多项式一样,可用于创建校准曲线(用于插值的曲线)来代替复杂的函数关系。 然而,出于准确性目的,如果要根据曲线计算插值,建议定期数据间隔和复制。 由于 X 值的间隔不规则,我想知道是否有第三个(或更多)变量同时影响 X 和 Y。 例如,两者都是来自每日或每周测试读数的读数。
- 是否存在一个基本的首要原则,以 X 和 Y 的关系为基础,例如:剂量反应;细胞生长;污染腐蚀等
- 为什么积分这么少? 复制的成本是多少?
根据我的经验,如果存在基本的非线性关系,那么通常值得付出努力来获取数据并拟合关系以估计参数(学习曲线、退化曲线)等。正如在Craige Hales,控制点(数量和位置)、节点和端点的微小差异可能会导致样条曲线的曲率(曲线上的点)产生很大差异,尤其是在“x”中存在较大间隙的情况下。我的预感是 Excel 故意不发布曲线样条的点或公式,因此人们不会像拟合模型一样使用它来进行估计。请注意,当 X 值和复制值“接近”时,插值的风险要小得多。
样条线在起点和终点选择的斜率对于 JMP 和 Excel 来说似乎不同。 样条线在每对点之间使用不同的三次方,可以平滑地连接大量点,匹配斜率和曲率。 如果只有四个点,则将三次拟合到这四个点并使用公式进行插值可能是有意义的。
也许我们会得到统计学家的答案。
Graph Builder can do it. So can Fit Y by X.Graph Builder can do it. So can Fit Y by X.图形生成器可以做到这一点。 所以可以用 X 来拟合 Y。
对于这里造成的混乱,我深表歉意。
数据:

在JMP中,我用X拟合Y


如果我在Excel中输入相同的数据

我明白了

请注意,在 JMP 绿线中,左下角周围的曲线(X 值 2-3 之间)有一点振荡/扭结,而在 Excel 中并非如此。
我的最终目标是从该行插入值,因此如果 Excel 和 JMP 给出两条不同的行,那么我最终会得到不同的插值。
思考@gzmorgan0解释,您可以在图形生成器中执行此操作:
Select Points, then SHIFT to add the lineSelect Points, then SHIFT to add the line选择“点”,然后按 SHIFT 键添加线
这就是我想做的
使用平滑曲线功能复制 Excel 的散点图。
如果我使用 JMP fit Y by X 和灵活的脊柱,我会得到与 Excel 使用散点图 + 平滑线生成的曲线不同的曲线。 我相信Excel正在使用贝塞尔曲线拟合。
数据点:
旋转| X |是
一个 | 2.41 | 2.41 846.8692
一个 | 0.93 | 0.93 77.043
一个 | 1.37 | 1.37 155.2193
一个 | 1.96 | 1.96 390.4639

我不想使用柔性样条线来绘制这条线,但我想强制贝塞尔曲线。 我希望这是有道理的。
谢谢
嗨克雷格,
我试图理解 path() 函数和移动点、控制点、贝塞尔点。
从我掌握的数据来看,我有以下四点
点=
[ 0.93 77.04 1,
1.37 155.22 0,
1.96 390.46 0,
2.41 846.87 3];
当我将其放入路径函数中时,我在点 1 和点 4 之间得到一条线,但它没有经过点 2 和点 3。 我错过了什么吗?
谢谢。
多个答案,取决于您需要做什么。 这里有一些。
对于 2D 图形,您可以使用路径函数。 您无法通过搜索 Bezier 找到它,因为脚本索引将其拼写为 Bézier。 尝试搜索 zier。@XanGregg @sheila_loring
此示例使用可拖动手柄扩展了脚本索引示例。
// initial data; points 3 and 5 are not initially constrained about point 4
points = [
10 10 1,// move-to
30 70 0,// control point
40 10 0,// control point
50 40 3,// bezier
60 60 0,// control point
70 20 0,// control point
90 10 3 // bezier
];
// moving a square handle will call this function to
// copy the handle coordinates to the matrix
setpoint = Function( {index, x, y}, // parameters
{angle, distance}, // local variables
// copy to the matrix
points[index, 1] = x;
points[index, 2] = y;
// 3 and 5 are constrained about 4, comment out to see why...
// if the angles don't match, it isn't smooth
If( index == 3 | index == 5,
other = If( index == 3, 5, 3 ); // if I'm 3, he must be 5, etc
// trig in radians, 2*pi is 360
// atan does all 4 quadrants with 2 arguments
angle = ATan( points[index, 2] - points[4, 2], points[index, 1] - points[4, 1] );
// maintain other's distance
distance = Sqrt( (points[other, 2] - points[4, 2]) ^ 2 + (points[other, 1] - points[4, 1]) ^ 2 );
// fix other's angle to match my angle, but opposite me
points[other, 1] = points[4, 1] + distance * Cos( angle + Pi() );
points[other, 2] = points[4, 2] + distance * Sin( angle + Pi() );
);
// redraw
gb << inval;
);
New Window( "Example",
gb = Graph Box(
Fill Color( "blue" );
// there is no good shortcut for creating handles; the JSL holds the instances
Handle( points[1, 1], points[1, 2], setpoint( 1, x, y ) );
Handle( points[2, 1], points[2, 2], setpoint( 2, x, y ) );
Handle( points[3, 1], points[3, 2], setpoint( 3, x, y ) );
Handle( points[4, 1], points[4, 2], setpoint( 4, x, y ) );
Handle( points[5, 1], points[5, 2], setpoint( 5, x, y ) );
Handle( points[6, 1], points[6, 2], setpoint( 6, x, y ) );
Handle( points[7, 1], points[7, 2], setpoint( 7, x, y ) );
// construction lines
Pen Color( "red" );
Line( {points[1, 1], points[1, 2]}, {points[2, 1], points[2, 2]} );
Line( {points[3, 1], points[3, 2]}, {points[4, 1], points[4, 2]} );
Line( {points[4, 1], points[4, 2]}, {points[5, 1], points[5, 2]} );
Line( {points[6, 1], points[6, 2]}, {points[7, 1], points[7, 2]} );
// the bezier
Pen Color( "black" );
Path( points );
)
);我意识到我还应该限制移动点 4 来拖动点 3 和 5。 (没做过,应该很容易。)
Bezier control pointsBezier control points贝塞尔曲线控制点
也许您需要样条线。 我不确定脚本索引中样条曲线、p 样条曲线、b 样条曲线之间的区别是什么。 我用了样条线HeatColor、样条线、插值制作这条曲线
spline coef, spline evalspline coef, spline eval样条系数、样条评估
JMP 的 3D OpenGL 支持中还支持贝塞尔样条线: https://www.jmp.com/support/help/14-2/bezier-curves.shtml这可能有助于绘制曲面。 一个糟糕的例子隐藏在快速傅里叶变换视频
很棒的帖子@杜安·海耶斯了解三次样条
我一路上遇到的一件事: https://www.tinaja.com/glib/bezconn.pdf