數(shù)值方法課程設(shè)計(jì)---牛頓法解非線性方程組_第1頁(yè)
已閱讀1頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  題目:牛頓法解非線性方程組</p><p>  典型數(shù)值算法的C++語(yǔ)言程序設(shè)計(jì)</p><p>  1.經(jīng)典四階龍格庫(kù)塔法解一階微分方程組</p><p><b>  1.1算法說(shuō)明</b></p><p&

2、gt;  龍格-庫(kù)塔(Runge-Kutta)方法是一種在工程上應(yīng)用廣泛的高精度單步算法。由于此算法精度高,采取措施對(duì)誤差進(jìn)行抑制,所以其實(shí)現(xiàn)原理也較復(fù)雜。該算法是構(gòu)建在數(shù)學(xué)支持的基礎(chǔ)之上的。</p><p>  4階龍格-庫(kù)塔方法(RK4)可模擬N=4的泰勒方法的精度。這種算法可以描述為,自初始點(diǎn)開(kāi)始,利用下面的計(jì)算方法生成近似序列</p><p>  1.2經(jīng)典四階龍格庫(kù)塔法解一階微分

3、方程組算法流程圖</p><p>  1.3經(jīng)典四階龍格庫(kù)塔法解一階微分方程組程序調(diào)試</p><p>  將編寫好的代碼放在VC6.0環(huán)境中編譯,直接執(zhí)行程序便可以得到求解微分方程,并且的結(jié)果。如圖:</p><p>  將這些點(diǎn)進(jìn)行插值或者擬合后就可以得到微分方程的解。</p><p>  1.4 經(jīng)典四階龍格庫(kù)塔法解一階微分方程組代碼&

4、lt;/p><p>  #include <iostream></p><p>  #include <iomanip></p><p>  using namespace std;</p><p>  //f為函數(shù)的入口地址,x0、y0為初值,xn為所求點(diǎn),step為計(jì)算次數(shù)</p><p>  

5、double Runge_Kuta( double (*f)(double x, double y), double x0, double y0, double xn, long step )</p><p><b>  {</b></p><p>  double k1,k2,k3,k4,result;</p><p>  double h=

6、(xn-x0)/step;</p><p>  if(step<=0)</p><p>  return(y0);</p><p>  if(step==1)</p><p><b>  {</b></p><p>  k1=f(x0,y0);</p><p>  k

7、2=f(x0+h/2, y0+h*k1/2);</p><p>  k3=f(x0+h/2, y0+h*k2/2);</p><p>  k4=f(x0+h, y0+h*k3);</p><p>  result=y0+h*(k1+2*k2+2*k3+k4)/6;</p><p><b>  }</b></p>

8、;<p><b>  else</b></p><p><b>  {</b></p><p>  double x1,y1;</p><p><b>  x1=xn-h;</b></p><p>  y1=Runge_Kuta(f, x0, y0, xn-h,s

9、tep-1);</p><p>  k1=f(x1,y1);</p><p>  k2=f(x1+h/2, y1+h*k1/2);</p><p>  k3=f(x1+h/2, y1+h*k2/2);</p><p>  k4=f(x1+h, y1+h*k3);</p><p>  result=y1+h*(k1+2*

10、k2+2*k3+k4)/6;</p><p><b>  }</b></p><p>  return(result);</p><p><b>  }</b></p><p>  int main()</p><p><b>  {</b></p

11、><p>  double f(double x, double y);</p><p>  double x0,y0;</p><p>  double a,b;</p><p>  cout<<"請(qǐng)輸入初值x0,y0:";</p><p>  cin>>x0>>y

12、0;</p><p>  cout<<"請(qǐng)輸入?yún)^(qū)間:";</p><p>  cin>>a>>b;</p><p>  //double x0=0,y0=1;</p><p>  double x,y,step;</p><p><b>  long i

13、;</b></p><p>  cout<<"請(qǐng)輸入步長(zhǎng):";</p><p>  cin>>step;</p><p>  //step=0.1;</p><p>  cout.precision(10);</p><p>  for(i=0;i<=(b-

14、a)/step;i++)</p><p><b>  {</b></p><p>  x=x0+i*step;</p><p>  cout<<setw(8)<<x<<setw(18)<<Runge_Kuta(f,x0,y0,x,i)<<endl;</p><p&g

15、t;<b>  }</b></p><p>  return(0);</p><p><b>  }</b></p><p>  double f(double x, double y)</p><p><b>  {</b></p><p><b

16、>  double r;</b></p><p>  r=(x-y)/2;</p><p>  return(r);</p><p><b>  }</b></p><p>  2. 高斯列主元法解線性方程組</p><p><b>  2.1算法說(shuō)明</b>

17、;</p><p>  首先將線性方程組做成增光矩陣,對(duì)增廣矩陣進(jìn)行行變換。</p><p>  對(duì)第元素,在第i列中,第i行及以下的元素選取絕對(duì)值最大的元素,將該元素最大的行與第i行交換,然后采用高斯消元法將新得到的消去第i行以下的元素。一次進(jìn)行直到。從而得到上三角矩陣。</p><p>  再對(duì)得到的上三角矩陣進(jìn)行回代操作,即可以得到方程組的解。</p&g

18、t;<p>  2.2高斯列主元算法流程圖</p><p>  2.3高斯列主元程序調(diào)試</p><p>  對(duì)所編寫的高斯列主元程序進(jìn)行編譯和鏈接,然后執(zhí)行得如下所示的窗口,我們按命令輸入增廣矩陣的行數(shù)為4,輸入4行5列的增廣矩陣:</p><p>  按回車鍵后,程序執(zhí)行得如下所示的結(jié)果:</p><p>  2.4 高斯列

19、主元算法代碼</p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #include<math.h></p><p>  //在列向量中尋找絕對(duì)值最大的項(xiàng),并返回該項(xiàng)的標(biāo)號(hào)</p><p>  int F

20、indMax(int p,int N,double *A)</p><p><b>  {</b></p><p>  int i=0,j=0;</p><p>  double max=0.0;</p><p>  for(i=p;i<N;i++)</p><p><b>  {

21、</b></p><p>  if(fabs(A[i*(N+1)+p])>max)</p><p><b>  {</b></p><p><b>  j=i;</b></p><p>  max=fabs(A[i*(N+1)+p]);</p><p>&l

22、t;b>  }</b></p><p><b>  }</b></p><p><b>  return j;</b></p><p><b>  }</b></p><p>  //交換矩陣中的兩行</p><p>  void Ex

23、changeRow(int p,int j,double *A,int N)</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p>  double C=0.0;</p><p>  for(i=0;i<N+1;i++)</p>

24、;<p><b>  {</b></p><p>  C=A[p*(N+1)+i];</p><p>  A[p*(N+1)+i]=A[j*(N+1)+i];</p><p>  A[j*(N+1)+i]=C;</p><p><b>  }</b></p><p&

25、gt;<b>  }</b></p><p>  //上三角變換,A為增廣矩陣的指針,N為矩陣的行數(shù)。</p><p>  void uptrbk(double *A,int N)</p><p><b>  {</b></p><p>  int p=0,k=0,q=0,j=0;</p>

26、;<p>  double m=0.0;</p><p>  for(p=0;p<N-1;p++)</p><p><b>  {</b></p><p>  //找出該列最大項(xiàng)的標(biāo)號(hào)</p><p>  j=FindMax(p,N,A);</p><p><b> 

27、 //交換p行和j行</b></p><p>  ExchangeRow(p,j,A,N);</p><p>  if(A[p*(N+1)+p]==0)</p><p><b>  {</b></p><p>  printf("矩陣是一個(gè)奇異矩陣。沒(méi)有唯一解。");</p>

28、<p><b>  break;</b></p><p><b>  }</b></p><p>  //消去P元素一下的p列內(nèi)容。</p><p>  for(k=p+1;k<N;k++)</p><p><b>  {</b></p><

29、;p>  m=A[k*(N+1)+p]/A[p*(N+1)+p];</p><p>  for(q=p;q<N+1;q++)</p><p>  A[k*(N+1)+q]=A[k*(N+1)+q]-m*A[p*(N+1)+q];</p><p><b>  }</b></p><p><b>  }

30、</b></p><p>  printf("\n增廣矩陣高斯列主元消去后的矩陣為:\n");</p><p>  for(j=0;j<N*(N+1);j++)</p><p><b>  {</b></p><p>  if(j%(N+1)==0)</p><p

31、>  printf("\n");</p><p>  printf("%lf\t",A[j]);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //下面是回代函數(shù)</b>

32、</p><p>  double* backsub(double *A,int N)</p><p><b>  {</b></p><p>  double* X=NULL,temp=0.0;</p><p>  int k=0,i=0;</p><p>  X=(double*)malloc

33、(N*sizeof(double));</p><p>  X[N-1]=A[(N-1)*(N+1)+N]/A[(N-1)*(N+1)+N-1];</p><p>  for(k=N-2;k>=0;k--)</p><p><b>  {</b></p><p><b>  temp=0.0;</b

34、></p><p>  for(i=k+1;i<N;i++)</p><p>  temp=temp+A[k*(N+1)+i]*X[i];</p><p>  X[k]=(A[k*(N+1)+N]-temp)/A[k*(N+1)+k];</p><p><b>  }</b></p><p

35、><b>  return X;</b></p><p><b>  }</b></p><p><b>  main()</b></p><p><b>  {</b></p><p>  int N=0,i=0;</p><p

36、>  double *A=NULL,*X=NULL;</p><p>  printf("\n請(qǐng)輸入待求解方程組的增廣矩陣的行數(shù):");</p><p>  scanf("%d",&N);</p><p>  A=(double*)calloc(N*(N+1),sizeof(double));</p>

37、<p>  printf("請(qǐng)輸入待求解方程組的增廣矩陣(%d行%d列):\n",N,N+1);</p><p>  for(i=0;i<N*(N+1);i++)</p><p>  scanf("%lf",&A[i]);</p><p>  system("cls");<

38、/p><p>  printf("方程的增廣矩陣為:\n");</p><p>  for(i=0;i<N*(N+1);i++)</p><p><b>  {</b></p><p>  if(i%(N+1)==0)</p><p>  printf("\n&qu

39、ot;);</p><p>  printf("%lf\t",A[i]);</p><p><b>  }</b></p><p>  uptrbk(A,N);</p><p>  X=backsub(A,N);</p><p>  printf("\n\n方程組的解

40、為:\n");</p><p>  for(i=0;i<N;i++)</p><p>  printf("X(%d)= %lf\n",i+1,X[i]);</p><p><b>  free(A);</b></p><p><b>  free(X);</b>&

41、lt;/p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  3.牛頓法解非線性方程組</p><p><b>  3.1算法說(shuō)明</b></p><p><b>  設(shè)已知。</b&g

42、t;</p><p><b>  第1步:計(jì)算函數(shù)</b></p><p>  第2步:計(jì)算雅可比矩陣</p><p>  第3步:求線性方程組</p><p><b>  的解。</b></p><p><b>  第4步:計(jì)算下一點(diǎn)</b></

43、p><p><b>  重復(fù)上述過(guò)程。</b></p><p>  3.2 牛頓法解非線性方程組算法流程圖</p><p>  3.3 牛頓法解非線性方程組算法程序調(diào)試</p><p>  我們以方程組為例進(jìn)行求解,我們按命令的要求,依次輸入</p><p>  牛頓法解非線性方程組:</p&g

44、t;<p>  x^2-2*x-y+0.5=0</p><p>  x^2+4*y^2-4=0</p><p>  輸入的初始近似值x0,y0</p><p><b>  2.00 0.25</b></p><p>  請(qǐng)依次輸入P的誤差限,F(xiàn)(P)的誤差限,最大迭代次數(shù)</p><p&

45、gt;  0.0001 0.0001 1000</p><p><b>  收斂到P的解為:</b></p><p>  X(1)=1.900691</p><p>  X(2)=0.311213</p><p><b>  迭代次數(shù)為:2</b></p><p>  誤差為

46、:0.000000</p><p>  3.4牛頓法解非線性方程組算法程序代碼</p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #include<math.h></p><p>  #define

47、N 2 //用來(lái)設(shè)置方程組的行數(shù)</p><p>  #define eps 2.2204e-16</p><p>  double* MatrixMultiply(double* J,double Y[]);</p><p>  double* Inv(double *J);</p><p>  double norm(double Q[]

48、);</p><p>  double* F(double X[]);</p><p>  double* JF(double X[]);</p><p>  int method(double* Y,double epsilon);</p><p>  int newdim(double P[],double delta,double ep

49、silon,int max1,double *err)</p><p><b>  {</b></p><p>  double *Y=NULL,*J=NULL,Q[2]={0},*Z=NULL,*temp=NULL;</p><p>  double relerr=0.0;</p><p>  int k=0,i=0,

50、iter=0;</p><p><b>  Y=F(P);</b></p><p>  for(k=1;k<max1;k++)</p><p><b>  {</b></p><p><b>  J=JF(P);</b></p><p>  tem

51、p=MatrixMultiply(Inv(J),Y);</p><p>  for(i=0;i<N;i++)</p><p>  Q[i]=P[i]-temp[i];</p><p><b>  Z=F(Q);</b></p><p>  for(i=0;i<N;i++)</p><p&g

52、t;  temp[i]=Q[i]-P[i];</p><p>  *err=norm(temp);</p><p>  relerr=*err/(norm(Q)+eps);</p><p>  for(i=0;i<N;i++)</p><p>  P[i]=Q[i];</p><p>  for(i=0;i<

53、;N;i++)</p><p>  Y[i]=Z[i];</p><p><b>  iter=k;</b></p><p>  if((*err<delta)||(relerr<delta)||method(Y,epsilon))</p><p><b>  break;</b><

54、;/p><p><b>  }</b></p><p>  return iter;</p><p><b>  }</b></p><p>  int method(double* Y,double epsilon)</p><p><b>  {</b>

55、</p><p>  if(fabs(Y[0])<epsilon&&fabs(Y[1])<epsilon)</p><p><b>  return 1;</b></p><p><b>  else</b></p><p><b>  return 0;<

56、;/b></p><p><b>  }</b></p><p>  //矩陣乘法,要求,J為方陣,Y為與J維數(shù)相同的列向量</p><p>  double *MatrixMultiply(double* J,double Y[])</p><p><b>  {</b></p>

57、<p>  double *X=NULL;</p><p>  int i=0,j=0;</p><p>  X=(double*)malloc(N*sizeof(double));</p><p>  for(i=0;i<N;i++)</p><p><b>  X[i]=0;</b></p&

58、gt;<p>  for(i=0;i<N;i++)</p><p>  for(j=0;j<N;j++)</p><p>  X[i]+=J[i*N+j]*Y[j];</p><p><b>  return X;</b></p><p><b>  }</b></p

59、><p>  //二階矩陣的求逆(在M次多項(xiàng)式曲線擬合算法文件中給出了對(duì)任意可逆矩陣的求逆算法)</p><p>  double *Inv(double *J)</p><p><b>  {</b></p><p>  double X[4]={0},temp=0.0;</p><p><b

60、>  int i=0;</b></p><p>  temp=1/(J[0]*J[3]-J[1]*J[2]);</p><p>  X[0]=J[3];</p><p>  X[1]=-J[1];</p><p>  X[2]=-J[2];</p><p>  X[3]=J[0];</p>

61、<p>  for(i=0;i<4;i++)</p><p>  J[i]=temp*X[i];</p><p><b>  return J;</b></p><p><b>  }</b></p><p>  double norm(double Q[])</p>

62、<p><b>  {</b></p><p>  double max=0.0;</p><p><b>  int i=0;</b></p><p>  for(i=0;i<N;i++)</p><p><b>  {</b></p>&l

63、t;p>  if(Q[i]>max)</p><p><b>  max=Q[i];</b></p><p><b>  }</b></p><p>  return max;</p><p><b>  }</b></p><p>  do

64、uble* F(double X[])</p><p><b>  {</b></p><p>  double x=X[0];</p><p>  double y=X[1];</p><p>  double *Z=NULL;</p><p>  Z=(double*)malloc(2*siz

65、eof(double));</p><p>  Z[0]=x*x-2*x-y+0.5;</p><p>  Z[1]=x*x+4*y*y-4;</p><p><b>  return Z;</b></p><p><b>  }</b></p><p>  double*

66、JF(double X[])</p><p><b>  {</b></p><p>  double x=X[0];</p><p>  double y=X[1];</p><p>  double *W=NULL;</p><p>  W=(double*)malloc(4*sizeof(d

67、ouble));</p><p>  W[0]=2*x-2;</p><p><b>  W[1]=-1;</b></p><p><b>  W[2]=2*x;</b></p><p><b>  W[3]=8*y;</b></p><p><b

68、>  return W;</b></p><p><b>  }</b></p><p><b>  main()</b></p><p><b>  {</b></p><p>  double P[2]={0};</p><p> 

69、 double delta=0.0,epsilon=0.0,err=0.0;</p><p>  int max1=0,iter=0,i=0;</p><p>  printf("牛頓法解非線性方程組:\nx^2-2*x-y+0.5=0\nx^2+4*y^2-4=0\n");</p><p>  printf("\n輸入的初始近似值x0

70、,y0\n");</p><p>  for(i=0;i<2;i++)</p><p>  scanf("%lf",&P[i]);</p><p>  printf("請(qǐng)依次輸入P的誤差限,F(xiàn)(P)的誤差限,最大迭代次數(shù)\n");</p><p>  scanf("%l

71、f%lf%d",&delta,&epsilon,&max1);</p><p>  iter=newdim(P,delta,epsilon,max1,&err);</p><p>  printf("收斂到P的解為:\n");</p><p>  for(i=0;i<2;i++)</p>

72、<p>  printf("X(%d)=%lf\n",i+1,P[i]);</p><p>  printf("\n迭代次數(shù)為:%d",iter);</p><p>  printf("\n誤差為:%lf\n",err);</p><p>  getchar();</p><

73、;p><b>  }</b></p><p>  4.龍貝格求積分算法</p><p><b>  4.1算法說(shuō)明</b></p><p>  生成的逼近表,并以為最終解來(lái)逼近積分</p><p>  逼近存在于一個(gè)特別的下三角矩陣中,第0列元素用基于個(gè)[a,b]子區(qū)間的連續(xù)梯形方法計(jì)算,然后

74、利用龍貝格公式計(jì)算。當(dāng)時(shí),第行的元素為</p><p>  當(dāng)時(shí),程序在第行結(jié)束。</p><p>  4.1龍貝格求積分算法流程圖</p><p>  4.3龍貝格求積分算法程序調(diào)試</p><p>  我們以求解積分方程為例,對(duì)所編寫的龍貝格求積分算法程序進(jìn)行編譯和鏈接,經(jīng)執(zhí)行后得如下所示的窗口</p><p> 

75、 4.4龍貝格求積分算法代碼</p><p>  #include<stdio.h></p><p>  #include<math.h></p><p>  double f(double x)</p><p><b>  {</b></p><p>  returnx

76、*x;</p><p><b>  }</b></p><p><b>  main()</b></p><p><b>  {</b></p><p>  int M=1,n=0,p=0,K=0,i=0,j=0,J=0;</p><p>  doubl

77、e h=0.0,a=0.0,b=0.0,err=1.0,quad=0.0,s=0.0,x=0.0,tol=0.0;</p><p>  double R[30][30]={0};</p><p><b>  a=0;</b></p><p><b>  b=1;</b></p><p><b&

78、gt;  h=b-a;</b></p><p><b>  n=4;</b></p><p>  tol=0.000001;</p><p>  printf("求解函數(shù)y=x*x在(0,1)上的龍貝格矩陣\n");</p><p>  printf("龍貝格矩陣最大行數(shù)為%d\

79、n誤差限為%lf\n",n,tol);</p><p>  R[0][0]=h*(f(a)+f(b))/2;</p><p>  while(((err>tol)&&(J<n))||(J<4))</p><p><b>  {</b></p><p><b>  J=

80、J+1;</b></p><p><b>  h=h/2;</b></p><p><b>  s=0;</b></p><p>  for(p=1;p<=M;p++)</p><p><b>  {</b></p><p>  x=a

81、+h*(2*p-1); </p><p><b>  s=s+f(x);</b></p><p><b>  }</b></p><p>  R[J][0]=R[J-1][0]/2+h*s;</p><p><b>  M=2*M;</b></p><p&g

82、t;  for(K=1;K<=J;K++)</p><p><b>  {</b></p><p>  R[J][K]=R[J][K-1]+(R[J][K-1]-R[J-1][K-1])/(pow(4,K)-1);</p><p><b>  }</b></p><p>  err=fabs(

83、R[J-1][J-1]-R[J][K]);</p><p><b>  }</b></p><p>  quad=R[J][J];</p><p>  printf("\n龍貝格矩陣為:\n");</p><p>  for(i=0;i<(J+1);i++)</p><p&g

84、t;<b>  {</b></p><p>  for(j=0;j<(J+1);j++)</p><p><b>  {</b></p><p>  printf("%.5lf ",R[i][j]);</p><p><b>  }</b></p

85、><p>  printf("\n");</p><p><b>  }</b></p><p>  printf("\n積分值為:quad=%lf",quad);</p><p>  printf("\n誤差估計(jì)為:err=%lf",err);</p>

86、<p>  printf("\n使用過(guò)的最小步長(zhǎng):h=%lf\n",h);</p><p>  getchar();</p><p><b>  }</b></p><p>  5.三次樣條插值算法</p><p><b>  5.1算法說(shuō)明</b></p&g

87、t;<p>  5.2 三次樣條插值算法(壓緊樣條)程序調(diào)試</p><p>  求三次緊壓樣條曲線,我們以經(jīng)過(guò)點(diǎn)(0,0),(1,0.5),(2,2.0)和(3,1.5),且一階導(dǎo)數(shù)的邊界條件為S’(0)=0.2和S’(3)=-1為例。我們將所編寫的程序經(jīng)過(guò)編譯,鏈接和執(zhí)行后得如下所示的結(jié)果</p><p>  我們借助Matlab繪制出以上三次壓緊樣條的函數(shù)圖像如下所示&

88、lt;/p><p>  5.3 三次樣條插值算法(壓緊樣條)代碼</p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #define MAX 4</p><p>  double *diff(double X[],in

89、t n)</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p>  double *H=NULL;</p><p>  H=(double*)malloc((n-1)*sizeof(double));</p><p> 

90、 for(i=1;i<=n-1;i++)</p><p><b>  {</b></p><p>  H[i-1]=X[i]-X[i-1];</p><p><b>  }</b></p><p><b>  return H;</b></p><p&

91、gt;<b>  }</b></p><p>  double *divide(double Y[],int N,double H[])</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p>  double *D=NUL

92、L;</p><p>  D=(double*)malloc(N*sizeof(double));</p><p>  for(i=0;i<N;i++)</p><p><b>  {</b></p><p>  D[i]=Y[i]/H[i];</p><p><b>  }<

93、;/b></p><p><b>  return D;</b></p><p><b>  }</b></p><p><b>  main()</b></p><p><b>  {</b></p><p>  doubl

94、e X[MAX]={0,1,2,3},Y[MAX]={0,0.5,2.0,1.5},S[MAX][MAX]={0},temp=0.0,M[MAX]={0};</p><p>  int N=MAX-1,i=0,k=0;</p><p>  double A[MAX-1-2]={0},B[MAX-1-1]={0},C[MAX-1-1]={0};</p><p>  d

95、ouble dx0=0.2,dxn=1.0;</p><p>  double *H=NULL,*D=NULL,*U=NULL;</p><p>  printf("求解經(jīng)過(guò)點(diǎn)(0,0.0),(1,0.5),(2,2.0)和(3,1.5)\n而且一階導(dǎo)數(shù)邊界條件S'(0)=0.2和S'(3)=-1的三次壓緊樣條曲線\n\n");</p>&

96、lt;p>  H=diff(X,MAX);</p><p>  D=divide(diff(Y,MAX),N,H);</p><p>  for(i=1;i<N-2;i++)</p><p>  A[i]=H[i+1];</p><p>  for(i=0;i<N-1;i++)</p><p>  B

97、[i]=2*(H[i]+H[i+1]);</p><p>  for(i=1;i<N-1;i++)</p><p>  C[i]=H[i+1];</p><p>  U=diff(D,N);</p><p>  for(i=0;i<N;i++)</p><p>  U[i]=U[i]*6;</p>

98、;<p>  B[0]=B[0]-H[0]/2;</p><p>  U[0]=U[0]-3*(D[0]-dx0);</p><p>  B[N-2]=B[N-2]-H[N-1]/2;</p><p>  U[N-2]=U[N-2]-3*(dxn-D[N-1]);</p><p>  for(k=2;k<=N-1;k++)

99、</p><p><b>  {</b></p><p>  temp=A[k-2]/B[k-2];</p><p>  B[k-1]=B[k-1]-temp*C[k-2];</p><p>  U[k-1]=U[k-1]-temp*U[k-2];</p><p><b>  }<

100、/b></p><p>  M[N-1]=U[N-2]/B[N-2];</p><p>  for(k=N-2;k>=1;k--)</p><p>  M[k]=(U[k-1]-C[k-1]*M[k+1])/B[k-1];</p><p>  M[0]=3*(D[0]-dx0)/H[0]-M[0]/2;</p>&l

101、t;p>  M[N]=3*(dxn-D[N-1])/H[N-1]-M[N-1]/2;</p><p>  for(k=0;k<=N-1;k++)</p><p><b>  {</b></p><p>  S[k][0]=(M[k+1]-M[k])/(6*H[k]);</p><p>  S[k][1]=M[

102、k]/2;</p><p>  S[k][2]=D[k]-H[k]*(2*M[k]+M[k+1])/6;</p><p>  S[k][3]=Y[k];</p><p><b>  }</b></p><p>  printf("求得的三次壓緊樣條曲線的矩陣S為:\n");</p>&l

103、t;p>  for(i=0;i<MAX-1;i++)</p><p><b>  {</b></p><p>  for(k=0;k<MAX;k++)</p><p><b>  {</b></p><p>  printf("%lf\t",S[i][k]);&

104、lt;/p><p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p>  for(i=0;i<N;i++)</p><p>  printf("\n在區(qū)間(0,1)上

105、的樣條為:y=%+lfx^3%+lfx^2%+lfx%+lf",S[i][0],S[i][1],S[i][2],S[i][3]);</p><p>  getchar();</p><p><b>  }</b></p><p>  6.M次多項(xiàng)式曲線擬合</p><p><b>  6.1算法說(shuō)明&

106、lt;/b></p><p>  設(shè)有N個(gè)點(diǎn),橫坐標(biāo)是確定的。最小二乘拋物線的系數(shù)表示為</p><p>  求解A,B和C的線性方程組為</p><p>  6.2 M次多項(xiàng)式曲線擬合算法流程圖</p><p>  6.3 M次多項(xiàng)式曲線擬合算法程序調(diào)試</p><p>  我們按命令依次輸入命令如下命令后,得

107、程序執(zhí)行結(jié)果如下</p><p>  6.4 M次多項(xiàng)式曲線擬合算法代碼</p><p>  #include<stdio.h></p><p>  #include<math.h></p><p>  #define MAX 20</p><p>  //求解任意可逆矩陣的逆,X為待求解矩陣,

108、E為全零矩陣,非單位矩陣,也可以是單位矩陣</p><p>  void inv(double X[MAX][MAX],int n,double E[MAX][MAX])</p><p><b>  {</b></p><p>  int i=0,j=0,k=0;</p><p>  double temp=0.0;&l

109、t;/p><p>  for(i=0;i<MAX;i++)</p><p><b>  {</b></p><p>  for(j=0;j<MAX;j++)</p><p><b>  if(i==j)</b></p><p>  E[i][j]=1;</p&g

110、t;<p><b>  }</b></p><p>  for(i=0;i<n-1;i++)</p><p><b>  {</b></p><p>  temp=X[i][i];</p><p>  for(j=0;j<n;j++)</p><p>

111、;<b>  {</b></p><p>  X[i][j]=X[i][j]/temp;</p><p>  E[i][j]=E[i][j]/temp;</p><p><b>  }</b></p><p>  for(k=0;k<n;k++)</p><p><

112、;b>  {</b></p><p><b>  if(k==i)</b></p><p><b>  continue;</b></p><p>  temp=-X[i][i]*X[k][i];</p><p>  for(j=0;j<n;j++)</p>&

113、lt;p><b>  {</b></p><p>  X[k][j]=X[k][j]+temp*X[i][j];</p><p>  E[k][j]=E[k][j]+temp*E[i][j];</p><p><b>  }</b></p><p><b>  }</b>

114、</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  main()</b></p><p><b>  {</b></p><p>  int n=0,M=0,i=0,j=0

115、,k=0;</p><p>  double X[MAX]={0},Y[MAX]={0},F[MAX][MAX]={0},B[MAX]={0};</p><p>  double A[MAX][MAX]={0},BF[MAX][MAX]={0},E[MAX][MAX]={0},C[MAX]={0};</p><p>  printf("\t\t\tM次多項(xiàng)

116、式曲線擬合\n\n請(qǐng)先輸入待擬合的點(diǎn)的個(gè)數(shù):");</p><p>  scanf("%d",&n);</p><p>  printf("\n請(qǐng)輸入%d個(gè)點(diǎn)的X坐標(biāo)序列:\n",n);</p><p>  for(i=0;i<n;i++)</p><p>  scanf(&qu

117、ot;%lf",&X[i]);</p><p>  printf("\n請(qǐng)輸入%d個(gè)點(diǎn)的Y坐標(biāo)序列:\n",n);</p><p>  for(i=0;i<n;i++)</p><p>  scanf("%lf",&Y[i]);</p><p>  printf(&quo

118、t;\n請(qǐng)輸入需要擬合的次數(shù):");</p><p>  scanf("%d",&M);</p><p>  for(i=0;i<n;i++)</p><p>  for(k=1;k<=M+1;k++)</p><p>  F[i][k-1]=pow(X[i],k-1);</p>

119、<p><b>  //求F的轉(zhuǎn)置</b></p><p>  for(i=0;i<n;i++)</p><p><b>  {</b></p><p>  for(j=0;j<M+1;j++)</p><p><b>  {</b></p>

120、<p>  BF[j][i]=F[i][j];</p><p><b>  }</b></p><p><b>  } </b></p><p>  //計(jì)算F與其轉(zhuǎn)置的BF的乘</p><p>  for(i=0;i<M+1;i++)</p><p> 

121、 for(j=0;j<M+1;j++)</p><p>  for(k=0;k<n;k++)</p><p>  A[i][j]+=BF[i][k]*F[k][j];</p><p>  //計(jì)算F的轉(zhuǎn)置BF與Y的乘</p><p>  for(i=0;i<M+1;i++)</p><p>  for

122、(j=0;j<n;j++)</p><p>  B[i]+=BF[i][j]*Y[j];</p><p>  inv(A,n,E);</p><p>  //計(jì)算A的逆E與B的乘</p><p>  for(i=0;i<M+1;i++)</p><p>  for(j=0;j<n;j++)</p

123、><p>  C[i]+=E[i][j]*B[j];</p><p>  printf("\n擬合后的%d次多項(xiàng)式系數(shù)為,冪次由高到低:\n",M);</p><p>  for(i=M;i>=0;i--)</p><p><b>  {</b></p><p>  prin

124、tf("%lf\t",C[i]);</p><p><b>  }</b></p><p>  printf("\n擬合后的%d次多項(xiàng)式為:\n",M);</p><p>  printf("\nP(x)=");</p><p>  for(i=M;i>=

125、0;i--)</p><p><b>  {</b></p><p><b>  if(i==0)</b></p><p>  printf("%+.3lf\n",C[i]);</p><p><b>  else</b></p><p&

126、gt;  printf("%+.3lf*x^%d",C[i],i);</p><p><b>  }</b></p><p>  getchar();</p><p><b>  }</b></p><p>  7.二分法解非線性方程</p><p>&l

127、t;b>  7.1算法說(shuō)明</b></p><p>  1.是起始區(qū)間,是中點(diǎn)。</p><p>  2.是第二個(gè)區(qū)間,它包含零點(diǎn)r,同時(shí)是中點(diǎn),區(qū)間的寬度范圍是的一半。</p><p>  3.得到第n個(gè)區(qū)間(包含r,并有中點(diǎn))后,可構(gòu)造出,它也包括r,寬度范圍是的一半。</p><p>  7.2 二分法解非線性方程算法

128、流程圖</p><p>  7.3 二分法解非線性方程算法程序調(diào)試</p><p>  我們將所編寫的二分法算法程序經(jīng)過(guò)編譯,鏈接和執(zhí)行后得所下結(jié)果</p><p>  7.4 二分法解非線性方程算法代碼</p><p>  #include<stdio.h></p><p>  #define eps 1

129、e-10</p><p>  double f(double x)</p><p><b>  {</b></p><p>  return 3*x*x*x+5;</p><p><b>  }</b></p><p>  void main()</p><

130、;p><b>  {</b></p><p>  double ga=0.0,gb=0.0,gc=0.0,a=0.0,b=0.0,c=0.0;</p><p>  printf("用二分法尋找方程3*x^3+5=0的根\n");</p><p>  printf("求根區(qū)間為(-5,5)\n");&

131、lt;/p><p><b>  a=-5,b=5;</b></p><p><b>  ga=f(a);</b></p><p><b>  gb=f(b);</b></p><p>  while((b-a)>eps)</p><p><b&g

132、t;  {</b></p><p>  c=(a+b)/2;</p><p><b>  gc=f(c);</b></p><p><b>  if(gc==0)</b></p><p><b>  break;</b></p><p>  

133、else if(gc*gb<0)</p><p><b>  {</b></p><p><b>  a=c;</b></p><p><b>  ga=gc;</b></p><p><b>  }else{</b></p><

134、p><b>  b=c;</b></p><p><b>  gb=gc;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("方程的根為:X=%lf\n",

135、b);</p><p>  getchar();</p><p><b>  }</b></p><p>  8.不動(dòng)點(diǎn)法解非線性方程</p><p><b>  8.1算法說(shuō)明</b></p><p><b>  先將改寫成</b></p>

136、<p>  然后對(duì)進(jìn)行迭代,即 其中</p><p>  然后判斷是否成立,成立則返回,不成立就重復(fù)以上步驟</p><p>  8.2 不動(dòng)點(diǎn)法解非線性方程算法程序調(diào)試</p><p>  我們將編寫好的不咪法解非線性方程算法程序進(jìn)行編譯,鏈接和執(zhí)行后得如下所示結(jié)果</p><p>  8.3 不動(dòng)點(diǎn)法解非線性方程算法代碼&l

137、t;/p><p>  #include<stdio.h></p><p>  #include<math.h></p><p>  #define MAX 20</p><p>  #define eps 2.2204e-16</p><p>  double g(double x)</p&g

138、t;<p><b>  {</b></p><p>  return 1-x*x/4+x;</p><p><b>  }</b></p><p><b>  main()</b></p><p><b>  {</b></p>

139、<p>  double P[MAX]={0},err=0.0,relerr=0.0,tol=0.0,p=0.0,p0=0.0;</p><p>  int k=0,max1=0,i=0;</p><p>  printf("不動(dòng)點(diǎn)法解非線性方程f(x)=1-x^2/2\n");</p><p>  printf("方程在[

140、0,1]上有解,初始值為p0=0\n");</p><p><b>  //初始化</b></p><p>  P[0]=p0=0;</p><p><b>  max1=100;</b></p><p>  tol=0.001;</p><p>  for(k=2

141、;k<=max1;k++)</p><p><b>  {</b></p><p>  P[k-1]=g(P[k-2]);</p><p>  err=fabs(P[k-1]-P[k-2]);</p><p>  relerr=err/(fabs(P[k-1]+eps));</p><p>

142、<b>  p=P[k-1];</b></p><p>  if((err<tol)||(relerr<tol))</p><p><b>  break;</b></p><p><b>  }</b></p><p>  if(k==max1)</p>

143、;<p>  printf("迭代次數(shù)超過(guò)允許的最大迭代次數(shù)!");</p><p>  printf("\n不動(dòng)點(diǎn)的近似值為:%lf",p);</p><p>  printf("\n程序迭代次數(shù)為%d",k);</p><p>  printf("\n近似值的誤差為:%lf&qu

144、ot;,err);</p><p>  printf("\n求解不動(dòng)點(diǎn)近似值的序列:\n");</p><p>  for(i=0;i<k;i++)</p><p><b>  {</b></p><p>  printf("%lf ",P[i]);</p>

145、<p><b>  }</b></p><p>  getchar();</p><p><b>  }</b></p><p>  9.霍納法多項(xiàng)式求值</p><p><b>  9.1算法說(shuō)明</b></p><p>  設(shè)是按式(20

146、)給出的多項(xiàng)式,且是用于計(jì)算的數(shù)。</p><p><b>  設(shè),并計(jì)算 其中</b></p><p>  則。進(jìn)一步考慮,如果</p><p><b>  則</b></p><p>  其中是n-1階多項(xiàng)式的商,是余數(shù)。</p><p>  9.2霍納法多項(xiàng)式求值算法

147、流程圖</p><p>  9.3霍納法多項(xiàng)式求值算法程序調(diào)試</p><p>  我們將所編寫的霍納法多項(xiàng)式求值算法程序經(jīng)過(guò)編譯,鏈接和執(zhí)行,根據(jù)窗口的命令依次輸入如下的命令后,得到如下所示的結(jié)果</p><p>  9.4霍納法多項(xiàng)式求值算法代碼</p><p>  #include<stdio.h></p>&

148、lt;p>  #include<stdlib.h></p><p>  void main()</p><p><b>  {</b></p><p>  int i=0,n=0;</p><p>  double *A=NULL,*B=NULL,c=0.0;</p><p> 

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論