计算方法实验报告PC版 —王世儒、王金金

这篇实验报告探讨了计算方法中的多项式求和算法,对比了秦九韶算法与普通算法的效率,并通过C语言实现验证。此外,还介绍了用雅克比迭代法和高斯-赛德尔迭代法解线性方程组的步骤与结果,展示了这两种迭代法在求解过程中的迭代次数和精度。最后,报告探讨了数值积分的梯形公式、复化梯形公式和复化辛甫生公式在求解定积分中的应用,以及它们在求解圆面积问题上的精度表现,得出复化新甫生公式更为精确的结论。
摘要由CSDN通过智能技术生成

计算方法实验

                                            —(14级计算机科学与技术2班)

实验仪器和环境:PC-机、codeblocks 10.05、MATLAB R2013a

编程语言:C、C++、MATLAB

 

实验一:编写程序求多项式的和

实验目的:

    比较两种求和方法发计算复杂度,通过比较两种程序的运行时间来实现。

实验内容:

    计算多项式:

方法一:一般算法,程序运行过程中,所算乘法次数为 ,由于所加项共(n+1)项,则加法次数为n,C语言代码实现如下:

 

#include <iostream>
#include <cstdio>
#include <ctime>

using namespace std;

double a[100005];
int main()
{

   double second1,second2;
   second1=(double)clock()/CLOCKS_PER_SEC;//clock()函数返回值本为毫秒,除以CLOCK_PER_SEC之后单位即变为秒
   int n,x;
   double mul,sum;
   n=10000;//记得给n更换取值看所用时间的差别
   x=1;//防止数据过大超范围,将x初始化为1
   sum=0;
   for(int i=0;i<=n;i++)
    {
       a[i]=1;//防止数据过大超范围,初始化为1
    }
   for(int i=0;i<=n;i++)
    {
       mul=1;
       for(int j=0;j<i;j++)
       {
           mul*=x;
       }
           mul*=a[i];
           sum+=mul;
    }
   cout<<"Pn(x)="<<sum<<endl;
   second2=(double)clock()/CLOCKS_PER_SEC;
   cout<<"second1="<<second1<<endl;
   cout<<"second2="<<second2<<endl;
   cout<<"用时为: "<<second2-second1<<endl;
   return 0;
}

 
n=10000时,输出结果为:
Pn(x)=10001
second1=0
second2=0.465
用时为: 0.465

 
n=100000时,输出结果为:
Pn(x)=100001
second1=0
second2=29.317  用时为: 29.317

方法二:秦九昭算法,已知递推公式为: ,u[n]即为所求结果,则整个过程中共进行了n次加法和n次乘法,C语言代码实现如下:

 

#include <iostream>

#include <cstdio>

#include <ctime>

#include <cstring>

 

using namespace std;

 

double a[100005];

double u[100005];

int main()

{

   double second1,second2;

   second1=(double)clock()/CLOCKS_PER_SEC;         //clock()函数返回值本为毫秒,除以CLOCK_PER_SEC之后单位即变为秒

   int n,x;

   n=100000;//记得给n更换取值看所用时间的差别

   x=1;//防止数据过大超范围,将x初始化为1

   memset(u,0,sizeof(u));

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

    {

       a[i]=1;

    }

   u[0]=a[n];

   for(int i=1;i<=n;i++)

    {

       u[i]=u[i-1]*x+a[n-i];

    }

   cout<<"Pn(x)="<<u[n]<<endl;

   second2=(double)clock()/CLOCKS_PER_SEC;

   cout<<"second1="<<second1<<endl;

   cout<<"second2="<<second2<<endl;

   cout<<"用时为: "<<second2-second1<<endl;

   return 0;

}

 

当n=10000时,输出为:

Pn(x)=10001

second1=0.001

second2=0.002

用时为: 0.001

 

当n=100000时,输出为:

Pn(x)=100001

second1=0.001

second2=0.003

用时为: 0.002

 

经比较,秦九韶算法比普通的算法快得多,算法更加优化,运算时间更短,复杂度更小,且当n越大时,这种差距体现的更加明显,所以秦九韶算法是一种非常好的方法。

 

 

 

 

 

 

 

 

 

实验二:求解线性方程组的解

 

实验目的:

用雅克比迭代法和高斯-赛德尔迭代法解线性方程组Ax=b,式中A为非奇异实矩阵。在给定迭代初值的情况下,进行迭代,直到满足精度要求。

实验内容:

试分别用雅克比迭代法,高斯-赛德尔迭代法解线性方程组:

 

方法一:用雅克比迭代法求解线性方程组

MATLAB代码实现:

yakebi.m文件函数实现:%函数名和文件名一致

%A=[5,1,-1,-2;2,8,1,3;1,-2,-4,-1;-1,3,2,7];

% b=[-2;-6;6;12];

 


function Y=yakebi(A,b)

if(any(diag(A))==0)

 

   error('error,pause')

 

end

 

eps=input('误差限eps=');

 

N=input('迭代次数N=');

 

D=diag(diag(A));

 

B=inv(D)*(D-A);

 

f=inv(D)*b;

 

K=0;

 

x0=zeros(size(b));

 

while 1

 

   x1=B*x0+f

 

   K=K+1;

 

   fprintf('第%d次迭代的近似解为',K)

 

   disp(x1');

 

   if norm(x1-x0,inf)<eps

 

       fprintf('满足精度要求的解为\n')

 

       disp(x1');

 

       break

 

   end

 

   if K>N

 

       fprintf('迭代超限')

 

   end

   x0=x1;

end


 

 

Command Window 中实现:

>> A=[5 1 -1 -2;2 8 1 3;1 -2 -4 -1;-13 2 7];

>> b=[-2 -6 6 12]';

>> yakebi(A,b);

误差限eps=0.00001;

迭代次数N=50;

 

x1 =

 

  -0.4000

  -0.7500

  -1.5000

   1.7143

 


第1次迭代的近似解为   -0.4000   -0.7500  -1.5000    1.7143

 

 

x1 =

 

   0.1357

  -1.1054

  -1.6536

   2.4071

 

第2次迭代的近似解为    0.1357   -1.1054  -1.6536    2.4071

 

 

x1 =

 

   0.4532

  -1.4799

  -1.5152

   2.6798

 

第3次迭代的近似解为    0.4532   -1.4799  -1.5152    2.6798

 

 

x1 =

 

   0.6649

  -1.6788

  -1.3167

   2.8462

 

第4次迭代的近似解为    0.6649   -1.6788  -1.3167    2.8462

 

 

x1 =

 

   0.8109

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值