@Craige_Hales和@mitulshah ,
我對貝塞爾曲線的知識和經驗有限。 我已經看到它們在起草(建築和景觀)設計和服裝設計中的實用性。 當然,數學基礎對我來說總是很有趣。我在網上查了一下,發現@mitulshah求Excel的Bezier spline,B-spline,算法是比較常見的。 一個鏈接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 表中。第二張圖片顯示了 JMP GB 線(曲線),其中覆蓋了 Excel 插值點。
Excel Interpolated Points > Spin B in JMP tableExcel 插值點 > JMP 表中的自旋 B
JMP Line(curve) spline overlaid with Excel interpolationsJMP 線(曲線)樣條覆蓋 Excel 插值
您會注意到插值與上尾部的 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 可以做到。 所以可以用 X 擬合 Y。
對於這裡的混亂,我深表歉意。
數據:

在 JMP 中,我用 X 擬合 Y


如果我在Excel中輸入相同的數據

我明白了

請注意,在 JMP 綠線中,左下方(X 值 2-3 之間)的曲線中有一點振盪/扭結,而在 Excel 中情況並非如此。
我的最終目標是從該行內插值,因此如果 Excel 和 JMP 給出兩條不同的線,那麼我最終會得到不同的內插值。
這就是我想要做的
使用平滑曲線功能複制 Excel 的散點圖。
如果我使用具有靈活脊柱的 JMP fit Y by X,我得到的曲線與 Excel 使用散點圖 + 平滑線生成的曲線不同。 我相信 Excel 正在使用貝塞爾曲線擬合。
數據點:
自旋 | × |是
一個 | 2.41 | 846.8692
一個 | 0.93 | 77.043
一個 | 1.37 | 155.2193
一個 | 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。 我錯過了什麼嗎?
謝謝。
多個答案,取決於您需要做什麼。 這裡有一些。
對於二維圖形,您可以使用路徑函數。 您無法通過搜索 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 points貝塞爾控制點
也許你需要一個樣條曲線。 我不確定腳本索引中樣條曲線、p 樣條曲線、b 樣條曲線之間的區別是什麼。 我用樣條HeatColor vs Spline vs Interpolate使這條曲線
spline coef, spline eval樣條係數,樣條評估
在 JMP 的 3D OpenGL 支持中也支持貝塞爾曲線: https://www.jmp.com/support/help/14-2/bezier-curves.shtml這可能有助於繪製表面。 一個糟糕的例子隱藏在傅里葉變換視頻
很棒的帖子@Duane_Hayes了解三次樣條
我一路上遇到的事情: https://www.tinaja.com/glib/bezconn.pdf