《數值分析》上機實驗報告

2022-10-03 14:51:04 字數 3787 閱讀 5288

1.用newton法求方程

x7-x4+14=0

在(0.1,1.9)中的近似根(初始近似值取為區間端點,迭代6次或誤差小於0.00001)。

1.1 理論依據:

設函式在有限區間[a,b]上二階導數存在,且滿足條件

令故以1.9為起點

如此一次一次的迭代,逼近x的真實根。當前後兩個的差<=ε時,就認為求出了近似的根。本程式用newton法求代數方程(最高次數不大於10)在(a,b)區間的根。

1.2 c語言程式原**:

#include<>

#include<>

main()

while(fabs(x1-x2)>=0.00001||x1<0.1限制迴圈次數

printf("計算結果:x=%f\n",x1);}

1.3 執行結果:

1.4 matlab上機程式

function y=newton(f,df,x0,eps,m)

d=0;

for k=1:m

if feval(df,x0)==0

d=2;break

else

x1=x0-feval(f,x0)/feval(df,x0);

ende=abs(x1-x0);

x0=x1;

if e<=eps&&abs(feval(f,x1))<=eps

d=1;break

endendif d==1

y=x1;

elseif d==0

y='迭代m次失敗';

else

y= '奇異'

endfunction y=df(x)

y=7*x^6-28*4*x^3;

endfunction y=f(x)

y=x^7-28*x^4+14;

end>> x0=1.9;

>> eps=0.00001;

>> m=100;

>> x=newton('f','df',x0,eps,m);

>> vpa(x,7)

1.5 問題討論:

1.使用此方法求方解,用誤差來控制迴圈迭代次數,可以在誤差允許的範圍內得到比較理想的計算結果。此程式的不足之處是,所要求解的方程必須滿足上述定理的四個條件,但是第二和第四個條件在計算機上比較難以實現。

迭代法是乙個二階收斂迭代式,他的幾何意義xi+1是xi的切線與x軸的交點,故也稱為切線法。它是平方收斂的,但它是區域性收斂的,即要求初始值與方程的根充分接近,所以在計算過程中需要先確定初始值。

3.本題在理論依據部分,討論了區間(0.1,1.

9)兩端點是否能作為newton迭代的初值,結果發現0.1不滿足條件,而1.9滿足,能作為初值。

另外,該程式簡單,只有乙個迴圈,且為順序結構,故採用do-while迴圈。當然也可以選擇for和while迴圈。

2.已知函式值如下表:

試用三次樣條插值求f(4.563)及f』(4.563)的近似值。

2.1 理論依據

這裡,所以只要求出,就能得出插值函式s(x)。

求的方法為:

這裡最終歸結為求解乙個三對角陣的解。

用追趕法解三對角陣的方法如下:

,綜上可得求解方程ax=d的演算法:

2.2 c語言程式**:

#include<>

#include<>

void main()

; printf("請依次輸入xi:\n");

for(i=0;i<=9;i++)

scanf("%lf",&e[i求h矩陣

for(n=0;n<=8;n++)

h[n]=e[n+1]-e[n];

d[0]=6*((f[1]-f[0])/h[0]-g0)/h[0];

d[9]=6*(g9-(f[9]-f[8])/h[8])/h[8];

for(j=0;j<=7;j++)

d[j+1]=6*((f[j+2]-f[j+1])/h[j+1]-(f[j+1]-f[j])/h[j])/(h[j]+h[j+1]);

for(m=1;m<=8;m++)

u[m]=h[m-1]/(h[m-1]+h[m]);

for(k=1;k<=8;k++)

r[k]=h[k]/(h[k-1]+h[k]);

for(i=0;i<=9;i求u矩陣

for(p=0;p<=9;p++)

s[0][1]=1;

s[9][8]=1;

for(i=1;i<=8;i++)

printf("三對角矩陣為:\n");

for(i=0;i<=9;i++)

for(p=0;p<=9;p求r矩陣 }

printf("根據追趕法解三對角矩陣得:\n");

a[0]=s[0][0];

b[0]=d[0];

for(i=1;i<9;i++)

} x[9]=p10/q10;

printf("m[10]=%lf\n",x[9]);

for(i=9;i>=1;i--)

printf("可得s(x)在區間[4,5]上的表示式;\n");

printf("將x=4.563代入得:\n");

x0=5-4.563;

x1=4.563-4;

s4=x[3]*pow(x0,3)/6+x[4]*pow(x1,3)/6+(f[3]-x[3]/6)*(5-4.563)+(f[4]-x[4]/6)*(4.563-4);

g4=-x[3]*pow(x0,2)/2+x[4]*pow(x1,2)/2-(f[3]-x[3]/6)+(f[4]-x[4]/6);

printf("計算結果:f(4.563)的函式值是:%lf\nf(4.563)的導數值是:%lf\n",s4,g4);}

2.3 執行結果:

2.4 問題討論

1. 三次樣條插值效果比lagrange插值好,沒有runge現象,光滑性較好。

2. 本題的對任意劃分的三彎矩插值法可以解決非等距節點的一般性問題。

3. 程式設計過程中由於定義的陣列比較多,需要仔細弄清楚各陣列所代表的引數,要注意各下標代表的含義,特別是在用追趕法計算的過程中。

3.用romberg演算法求.

3.1 理論依據:

romberg演算法的計算步驟如下:

(1)先求出按梯形公式所得的積分值

(2)把區間2等分,求出兩個小梯形面積之和,記為,即

這樣由外推法可得,。

(3)把區間再等分(即等分),得復化梯形公式,由與外推可得,,如此,若已算出等分的復化梯形公式,則由richardson外推法,構造新序列

, m=1,2,…,l, k=1,2,…,l-m+1,

最後求得。

(4)或《就停止計算,否則回到(3),計算,一般可用如下演算法:

其具體流程如下,並全部存入第一列

通常計算時,用固定l=n來計算,一般l=4或5即能達到要求。

3.2 c語言程式**:

#include<>

#include<>

double f(double x計算f(x)的值

main()

{ double t[20][20],s,e=0.00001,a=1,b=3;

int i,j,l,k;

t[0][1]=(b-a)*(f(b)+f(a))/2下為romberg演算法

t[1][1]=(b-a)*(f(b)+2*f((b+a)/2)+f(a))/4;

t[0][2]=(a*t[1][1]-t[0][1])/(4-1);j=3;

for(l=2;fabs(t[0][j-1]-t[0][j-2])>=e;l++)

{for(k=1,s=0;k<=pow(2,l-1);k++)

數值分析上機實驗報告

題目 緒論 非線性方程求解及誤差估計 摘要 非線性方程的解析解通常很難給出,因此線性方程的數值解法就尤為重要。本實驗採用兩種常見的求解方法二分法 newton法和改進的newton法。可以節省計算機的計算時間,還能減小不必要的誤差。前言 目的和意義 掌握二分法與newton法的基本原理 應用以及熟練...

數值分析上機實驗報告六

題目 方程求根 摘要 數學 物理中的許多問題常常歸結為求解函式方程,這裡可以是代數多項式,也可以是超越函式。方程的解稱為它的根,或稱為的零點。然而非線性方程的解析解通常是很難給出,因此線性方程的數值解法就尤為重要。本實驗重點介紹幾種常見的較為方便實用的求解方法。前言 目的和意義 通過對二分法與new...

數值分析實驗報告

實驗一題目一 已知函式表如下 試用三次lagrange插值多項式求x 0.5635時的函式值。解 lagrange插值法公式 程式框圖如下 本題中n 4 分析設計思想 設計思路如上面的流程圖所示,用我們學過的c語言程式設計實現。程式清單 include include include float l...