數值分析實驗相關

2021-09-30 12:25:16 字數 3626 閱讀 6802

綜合說明:

在寫這次實驗的時候,程式的圖形方式選用的是sdl圖形庫,關於sdl圖形庫的使用,可以網上查詢相關資料,對於一般的2d圖形顯示還是很簡單好上手的。

這些實驗的**我都發在了github:

也遇到一些問題,我也分享一下解決辦法:

1.配置完的sdl專案顯示控制台:

需要在專案屬性-配置屬性-鏈結器-系統 選項卡中把子系統設定為控制台。

2.vs2012程式不能再xp系統上執行:

首先需要對vs2012打上最新的補丁。訪問選擇vs2012更新x(目前是5).

但是這樣往往還不夠,可能在xp執行的時侯還會出現缺少msvcp110.dll的問題。

這就需要安裝vs2012的執行庫

3.除錯時候遇到程式相對路徑不正確的問題

解決方法是在專案屬性-配置屬性-除錯-工作目錄 選擇生成的程式根目錄

4.sdl 滑鼠滾輪使用

這裡貼一段**大概就明白了。

while(sdl_pollevent(&event))

else if (event.type == sdl_mousemotion)

}else if (event.type == sdl_mousebuttondown)

else}}

else if (event.type == sdl_mousebuttonup)

}else if (event.type == sdl_mousewheel)

else if (event.wheel.y < 0)}}

當y值大於0時表示滾輪向上滾動,小於0表示滾輪向下滾動。

1.lagrange插值多項式

公式:

關鍵演算法:

double lagrange_n(double xx);

double y = ;

return lagrange(13,x,y,xx);

}double lagrange(int n,double *x,double *y,double xx)

addresult += y[k] * mulresult;

} return addresult;

}

其中陣列x,y就是測試資料

運算結果:

所畫函式就是ln(x),紅點就是測試資料。可能看不清。

2.newton插值多項式

公式:

其中f[x0,x1,....xn]為差商公式

差商(difference quotient)的定義:

函式f(x)在兩個互異點xi,xj處的一階差商定義為:

f[xi,xj]=[f(xi)-f(xj)]/(xi-xj)=(yi-yj)/(xi-xj)

一階差商的差商稱為函式f(x)在xi,xj,xk(i,j,k互異)點的二階差商:

f[xi,xj,xk]=/(xi-xk)

一般的,k-1階差商的差商稱為函式f(x)在n+1個互異點x0,x1,...,xk上的k階差商:

f[x0,x1,...,xk]=/(x0-xk)

特別的,規定零階差商f[xk]=f(xk)=yk

我們使用遞迴來定義它。

double newton_n(double xx);

double y = ;

for (int i = 0;i < 13;i ++)

} return newton(13,x,y,xx);}/*

原本效率較低

優化001:

陣列儲存臨時內容,減少重複計算

*/double diffquotient(double *x,double *y,int xstart,int xx)

else

else if (xx == 0)

else }}

double newton(int n,double *x,double *y,double xx)

result += anresult;

} return result;

}

對於差商演算法,只使用遞迴會導致效率極低。經過分析發現,差商計算過程中有很多中間步驟是重複計算的,於是使用陣列來臨時儲存計算結果,來對其優化。效果很不錯。

計算結果:

3.hermite插值多項式

公式:

演算法:

double hermite_n(double xx);

double y = ;

double m = ;

return hermite(10,x,y,m,xx);

}double hermite(int n,double *x,double *y,double *m,double xx)

double ljs = 0;

for (int k = 0;k < n;k ++)

double aj;

aj = (1 - 2 * (xx - x[j]) * ljs) * lj * lj;

double bj;

bj = (xx - x[j]) * lj * lj;

result += y[j] * aj + m[j] * bj;

} return result;

}

運算結果:

數值分析實驗二 數值積分

1 2 include include using namespace std double f double x return pow x,2 int main double a,b,e int n cin a b e cin n double h b a n double x 1000 x 0 ...

數值分析實驗 二 之數值積分與微分

1 用復化梯形公式的自動控制誤差演算法求積分。2 romberg積分演算法求積分。復化梯形公式 sy2 1.m檔案 myint 0,1,100 fun1.m檔案 function f fun1 x if x 0 x 1 f 1 else f sin x x endmyint,m檔案 function...

Python數值分析實驗 近似與求根

print 第一種方法 第二種方法 二分法 x0 初始值,sigma 容許誤差 n 迭代上限 x0 1.5 sigma math.pow 10,6 n 1000 def binary split x0,sigma,n a,b 為求根區間上下界 count為迭代次數計數器 a math.floor x...