數值分析的上機作業,一開始想用matlab做,但是發現方向不對,所以就換成了c#,其餘的部分大都是窗體設計以及控制項的編碼,是個人而定,這裡只展示下
核心**
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.drawing;
using system.windows.forms;
namespace three_times_spline_interpolation
, y=;
public int edgecondition; //1為第一種邊界條件,2為第一種邊界條件,3為第一種邊界條件
public float head, tail;
public int nodenum;
public void cauc(panel p) //定義陣列,影象編輯
k[0] = ((y[1] - y[0]) / (x[1] - x[0]) - head) * 6 / (x[1] - x[0]); //頭節點的6倍的差商,g(0)
k[nodenum] = (tail - (y[nodenum] - y[nodenum - 1]) / (x[nodenum] - x[nodenum - 1])) * 6 / (x[nodenum] - x[nodenum - 1]); //g(num)
for (int b = 1; b< nodenum; b++)
i_j_k[0] = (x[nodenum] - x[nodenum - 1]) / (x[1] - x[0] + x[nodenum] - x[nodenum - 1]); //以下是三次樣條求解
i_j_k[1] = 1 - i_j_k[0];
i_j_k[2] = (i_j_k[0] * (y[1] - y[0]) / (x[1] - x[0])+i_j_k[1]*(y[nodenum]-y[nodenum-1])/(x[nodenum]-x[nodenum-1]))*3;
drawpic(x, y, solveequation(i, j, k, nodenum, edgecondition,i_j_k), p);
float solveequation(float i, float j, float k, int n, int edgecondition, float i_j_k)
switch (edgecondition)
m[n]=(float)0.5*(k[n]-m[n-1]);
//e=m[0]-temp;
p++;
}break;
case 2: //第二種邊界條件
k[1] = k[1] - i[0] * head;
k[n - 1] = k[n - 1] - j[n - 1] * tail;
i[1] = 0;
j[n - 1] = 0;
m[0] = head;
m[n] = tail;
for (int p = 1; p < 100; p++)
}break;
case 3: //第三種邊界條件
float q = new float[n];
for(int a =0;afor (int p = 1; p < 100; p++)
q[n - 1] = (float)0.5 * (i_j_k[2]-i_j_k[1]*q[0]-i_j_k[0]*q[n-2]);
}break;
}return m;
}void drawpic(float x, float y, float m, panel p) //畫圖了}}
catch }}
}
三次樣條插值 c
include include include include using namespace std double zuigan double a,double b,double c,double f,int n 追趕法求線性方程組 for int i 0 ifor int i n 2 i 0 i...
三次樣條插值
條件 1 輸入 x y f x 0 leq i leq n 2 要求擬合的曲線 s x 滿足 對於任意的 1 leq i leq n 1 在 x 處一階二階導數連續,s x 也連續,且 s x f x s x f x 求解過程 設 s m 對於區間 x x s x 是 x x 上的線性函式,所以設 ...
三次樣條插值介紹
樣條插值是一種工業設計中常用的 得到平滑曲線的一種插值方法,三次樣條是其中用的較為廣泛的一種。樣條插值最初是用於函式擬合 對於平面上的離散點,進行函式擬合時,一種簡單粗暴的方法就是不光滑的直線來將離散的點相連,即我們通常所說的線性擬合。線性擬合會存在乙個問題,擬合出來的函式不夠 光滑 為了讓線條更加...