精华内容
下载资源
问答
  • 实用标准文案 实用标准文案 文档大全 文档大全 数值计算方法 实验指导 Matlab 版 肇庆学院 数学与统计学学院 计算方法课程组 数值计算方法实验 1报告 班级 20xx 级 XXXXx 班 学号 20xx2409xxxx 姓名 XXX 成绩:实验...
  • 山东科技大学计算方法实验二 非线性方程求根实验报告完整版,C语言编程+流程图+运行结果 进一步熟练掌握求解非线性方程的二分法与Newton迭代法。 掌握二分法与Newton迭代法的算法,能运用程序设计语言和此方法编制...
  • 哈工大计算方法实验报告,包括拉格朗日插值、龙贝格积分法、四阶龙格、牛顿迭代法、高斯列主消元法,内容完整,排版整齐,适用于最新的实验要求!
  • 哈工大计算方法实验

    2013-12-01 10:20:38
    哈工大计算方法实验,计算方法 Lagrange插值,计算方法 Newton迭代法,计算方法 Romberg积分法,计算方法四阶Runge-Kutta方法,计算方法相对Gauss列主元消去法
  • 试验目的:练习用数值方法计算进行函数插值。 二.实验内容:已知正弦函数表 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9 0.4794 0.6442 0.7833 0.8912 0.9636 0.9975 0.9917` 0.9463 试分别计算 与 的近似值(用线性插值...
  • 一.试验目的:练习用数值方法计算定积分。 二.实验内容: 用复化梯形求积公式和复化Simpson求积公式计算 , 并估计误差。
  • 数值计算方法实验报告 很不错哦 自己写的 是c语言版本的 希望对大家有帮助
  • 计算方法实验指导书 河北大学电子信息工程学院 2007 年 9 月 目录 计算方法实验教学计划 2 实验一 MATLAB基本操作 .3 实验二插值法 .5 实验三线性方程组的直接解法 .7 实验四线性方程组的迭代方法 10 实验五函数逼近...
  • 计算方法上机实验报告,matlab程序与结果数据,拉格朗日法
  • 哈工大版 包括拉格朗日插值 龙贝格积分法 四阶龙格 牛顿迭代法 高斯列主消元法
  • 计算方法 实验报告 哈工大版

    热门讨论 2010-04-20 19:00:38
    Lagrange插值 Romberg积分 Newton迭代法 Runge-Kutta四阶法 Gauss列主元消去法
  • C语言-计算方法实验报告 HUST 各种计算方法的小程序
  • 这是本人自己的作业,先拿出来和大家分享,用C语言编写的,程序没有运行出结果,限本人C语言水平有限,只供大家参考。有需要者。(这是程序部分),
  • 哈工大计算方法实验报告答案
  • 计算方法实验报告,是用matlab实现的。里面有最常用的一些实验的程序的源代码。非常实用
  • 计算方法5个实验实验报告,经过老师检查过的~
  • 哈工大2020春计算方法实验报告

    千次阅读 多人点赞 2020-05-30 22:01:50
    哈工大2020春计算方法实验报告:包括拉格朗日插值方法、四阶龙格库塔方法和牛顿迭代法。实验结果和内容可能包含一些错误,请谨慎参考。

    哈工大2020春计算方法实验报告:包括拉格朗日插值方法、四阶龙格库塔方法和牛顿迭代法。实验结果和内容可能包含一些错误,请谨慎参考。在这里插入图片描述

    展开全文
  • 计算方法上机实验报告-matlab程序代码及报告 1.newton迭代法 2.Jacobi迭代法 3.Gauss_Seidel迭代法 4.Lagrange_interpolation插值 5.n次newton_interpolation插值 6.gauss_legendre求积
  • 计算方法实验一,方程求根 分别用Matlab和C写了一下,初学Matlab,如有不足还请指正。 实验内容: 1)在区间[0,1]内用二分法求方程ex+10∗x−2e^x+10*x-2ex+10∗x−2的近似根,要求误差不超过0.5×10−30.5\times10^...

    计算方法实验一,方程求根

    分别用Matlab和C写了一下,初学Matlab,如有不足还请指正。

    实验内容:
    1)在区间[0,1]内用二分法求方程 e x + 10 ∗ x − 2 e^x+10*x-2 ex+10x2的近似根,要求误差不超过 0.5 × 1 0 − 3 0.5\times10^{-3} 0.5×103
    2)取初值 x 0 = 0 x_0=0 x0=0,用迭代公式 x k + 1 = 2 − e x k 10 , ( k = 0 , 1 , 2 , . . . ) x_{k+1}=\frac{2-e^{x_k}}{10},(k=0,1,2,...) xk+1=102exk,(k=0,1,2,...)求方程 e x + 10 ∗ x − 2 e^x+10*x-2 ex+10x2的近似根,要求误差不超过 0.5 × 1 0 − 3 0.5\times10^{-3} 0.5×103
    3)取初值 x 0 = 0 x_0=0 x0=0,用牛顿迭代法求方程 e x + 10 ∗ x − 2 e^x+10*x-2 ex+10x2的近似根,要求误差不超过 0.5 × 1 0 − 3 0.5\times10^{-3} 0.5×103
    牛顿迭代公式: x k + 1 = x k − f ( x k ) f ′ ( x k ) x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)} xk+1=xkf(xk)f(xk)

    1. C

    #include <stdio.h>
    #include <Windows.h>
    #include <math.h>
    
    #define WUCHA (0.5*pow(10, -4))
    
    double f_x(double x);
    double erfenfa();
    double diedai();
    double newtown();
    
    int cnt = 0;
    
    int main()
    {
    	// 二分法
    	printf("二分法:%lf\n", erfenfa());
    	printf("计算次数%d\n", cnt);
    
    	// 迭代法
    	printf("迭代法:%lf\n", diedai());
    	printf("计算次数%d\n", cnt);
    
    	// 牛顿法
    	printf("牛顿法:%lf\n", newtown());
    	printf("计算次数%d\n", cnt);
    
    	system("pause");
    	return 0;
    }
    
    
    // f(x)
    double f_x(double x)
    {
    	return (exp(x) + 10 * x - 2);
    }
    
    // f'(x)
    double fd_x(double x)
    {
    	return (exp(x) + 10);
    }
    
    // 牛顿法
    double newtown()
    {
    	cnt = 0;
    
    	double x0 = 0.0;
    	double ret = f_x(x0);
    	double xk = x0 - f_x(x0) / fd_x(x0);
    
    	for (int k = 0; ; k++)
    	{
    		cnt++;
    		if (fabs(ret - 0) <= WUCHA)
    		{
    			break;
    		}
    
    		xk = xk - f_x(xk) / fd_x(xk);
    		ret = f_x(xk);
    	}
    
    	return xk;
    }
    
    // 迭代法
    double diedai()
    {
    	cnt = 0;
    	double x0 = 0.0;
    	double ret = f_x(x0);
    	double xk = x0;
    
    	//int k = 0;
    	for (int k = 0; ; k++)
    	{
    		cnt++;
    		if (fabs(ret - 0) <= WUCHA)
    		{
    			break;
    		}
    
    		xk = ((2 - exp(xk)) / 10);
    		ret = f_x(xk);
    	}
    
    	return xk;
    }
    
    // 二分法
    double erfenfa()
    {
    	cnt = 0;
    	double left = 0.0;
    	double right = 0.1;
    	double x = (left + right) / 2;
    	double ret = f_x(x);
    
    	while (fabs(ret - 0) >= WUCHA)
    	{
    		cnt++;
    		if (ret > 0)
    		{
    			right = x;
    		}
    		if (ret < 0)
    		{
    			left = x;
    		}
    		x = (left + right) / 2;
    		ret = f_x(x);
    	}
    	return x;
    }
    

    分界线


    2. Matlab

    2.1 二分法

    function x = erfen(f,a,b,e)
    % f是函数名 a,b是区间端点,e为精度
    fa = feval(f,a); % feval是求函数值
    fb = feval(f,b);
    if fa*fb>0
        error('此函数在[%d,%d]区间无解',a,b);
    end
    
    k = 0;
    x = (a+b)/2;
    while(b-a)>(2*e)
        fx=feval(f,x);
        if fa*fx<0
            b=x;
            fb=fx;
        else
            a=x;
            fb=fx;
        end
        k=k+1;
        x=(a+b)/2;
        
        fprintf("%d:x=%f\n", k, x);
        
    end
    

    2.2 不动点迭代法

    function x = diedai(f,diedaif,x0,e)
    
    N = 10; %最大迭代次数
    
    ret = feval(diedaif,x0);
    xk = x0;
    k = 0;
    
    while abs(x0-ret)>e & k<N
        
        xk = feval(diedaif,xk);
        ret = feval(diedaif,xk);
        
        k = k+1;
        fprintf("xk=%f\n", xk);
        %if
        %    break;
        %end
        
    end
    
    if k==N
        fprintf('超过最大迭代次数限制\n');
    
    end
    

    2.3 牛顿法

    function x = newton(f,fd,x0,e)
    % f->f(x)
    % fd->f'(x)
    % x0=0
    % e=0.0005
    
    N = 100; %最大迭代次数100
    x = x0;
    x0 = x+2*e;
    k = 0;
    while abs(x0-x)>e & k<N
        k = k+1;
        x0=x;
        x=x0-feval(f,x0)/feval(fd,x0);
        fprintf("x=%f\n", x);
    end
    
    if k==N
        warning('超过最大迭代次数限制');
    
    end
    

    分界线


    3.实验结果

    3.1 C

    C运行结果

    3.2 Matlab

    二分法
    迭代法
    牛顿法


    EOF,不足之处,还请指正。

    展开全文
  • 最小二乘法 计算方法实验报告,包括曲线拟合
  • 计算方法实验(四):牛顿迭代法

    千次阅读 2020-05-24 17:46:19
    2020哈工大计算方法课程实验(数值分析实验)之四牛顿Newton迭代法

    Newton迭代法数学原理

    求非线性方程 f ( x ) = 0 f(x) = 0 f(x)=0的根 x ∗ x^{*} x,牛顿迭代法计算公式

    x 0 = α x_{0} = \alpha x0=α

    x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n + 1} = x_{n} - \frac{f(x_{n})}{f^{'}(x_{n})} xn+1=xnf(xn)f(xn)

    n = 0 , 1 , ⋯ n = 0,1,\cdots n=0,1,

    一般地,牛顿迭代法具有局部收敛性,为保证迭代收敛,要求,对充分小的 δ > 0 \delta > 0 δ>0 α ∈ O ( x ∗ , δ ) \alpha \in O(x^{*},\delta) αO(x,δ)。如果 f ( x ) ∈ C 2 [ a , b ] f(x) \in C^{2}\lbrack a,b\rbrack f(x)C2[a,b] f ( x ∗ ) = 0 f(x^{*}) = 0 f(x)=0 f ′ ( x ∗ ) ≠ 0 f^{'}(x^{*}) \neq 0 f(x)=0,那么,对充分小的 δ > 0 \delta > 0 δ>0,当 α ∈ O ( x ∗ , δ ) \alpha \in O(x^{*},\delta) αO(x,δ)时,由牛顿迭代法计算出的 { x n } \{ x_{n}\} {xn}收敛于 x ∗ x^{*} x,且收敛速度是2阶的;如果 f ( x ) ∈ C m [ a , b ] f(x) \in C^{m}\lbrack a,b\rbrack f(x)Cm[a,b] f ( x ∗ ) = f ′ ( x ∗ ) = ⋯ = f ( m − 1 ) ( x ∗ ) = 0 f(x^{*}) = f^{'}(x^{*}) = \cdots = f^{(m - 1)}(x^{*}) = 0 f(x)=f(x)==f(m1)(x)=0 f ( m ) ( x ∗ ) ≠ 0 ( m > 1 ) f^{(m)}(x^{*}) \neq 0(m > 1) f(m)(x)=0(m>1),那么,对充分小的 δ > 0 \delta > 0 δ>0,当 α ∈ O ( x ∗ , δ ) \alpha \in O(x^{*},\delta) αO(x,δ)时,由牛顿迭代法计算出的 { x n } \{ x_{n}\} {xn}收敛于 x ∗ x^{*} x,且收敛速度是1阶的;

    问题

    利用牛顿迭代法求 f ( x ) = 0 f(x) = 0 f(x)=0的根

    输入:初值 α \alpha α,精度 ε 1 , ε 2 \varepsilon_{1},\varepsilon_{2} ε1,ε2,最大迭代次数 N N N

    输 出:方程 f ( x ) = 0 f(x) = 0 f(x)=0 x ∗ x^{*} x的近似值或计算失败标志

    程序流程

    核心代码

    #include <cmath>
    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    double x, e1, e2;
    int n;
    
    double f(double x) { return cos(x) - x; }
    double df(double x) { return -sin(x) - 1; }
    
    int main() {
        scanf("%lf%lf%lf%d", &x, &e1, &e2, &n);
        for (int i = 1; i <= n; i++) {
            double F = f(x), DF = df(x);
            if (fabs(F) < e1) {
                printf("%lf", x);
                return 0;
            }
            if (fabs(DF) < e2) {
                printf("Failed");
                return 0;
            }
            double x1 = x - F / DF;
            double tol = fabs(x - x1);
            if (tol < e1) {
                printf("%lf", x1);
                return 0;
            }
            x = x1;
        }
        printf("Failed");
        return 0;
    }
    

    详细报告

    展开全文
  • 理工大数值计算方法实验报告

    千次阅读 多人点赞 2018-07-15 19:33:20
    实验名称:方程求根 实验时间:2018.06.12 实验目的和要求: 1.了解方程求根的基本方法、基本原理、误差估计; 2.能够按照工程实际要求,选择适当的算法; 3.通过编写程序,进行算法设计和数值求解。 实验内容和...

    实验名称:方程求根

    实验时间:2018.06.12

    实验目的和要求:

    1.了解方程求根的基本方法、基本原理、误差估计;

    2.能够按照工程实际要求,选择适当的算法;

    3.通过编写程序,进行算法设计和数值求解。

    实验内容和原理:

     1. 熟悉使用二分法、牛顿法等方程求根的基本方法、基本原理、误差估计的相关理论。

    2. 选择方程求解方法中的两种方法求方程:f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度|x*-xn|<0.5×10-5

    如何对区间进行二分,并在二分后的左右两个区间中确定下一次求根搜索的区间?

    假设区间端点为x1和x2,则通过计算区间的中点x0,即可将区间[x1, x2]二分为[x1, x0]和[x0, x2]。这时,为了确定下一次求根搜索的区间,必须判断方程的根在哪一个区间内,由上图可知方程的根所在区间的两个端点处的函数值的符号一定是相反的。也就是说,如果f(x0)与f(x1)是异号的,则根一定在左区间[x1, x0]内,否则根一定在右区间[x0, x2]内。

    牛顿迭代法计算公式

    设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代

    公式。解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)在x0点附近展开成泰勒级数 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。

     

     

    主要仪器设备:

    电脑、win10、DevC++运行环境

     

    上机调试修改源程序:

    牛顿法:

    #include<iostream>

    using  namespace std;

    #include<cmath>

    const double N=0.5*1e-5;

    double get(double x){

           return (x-(x*x*x+4*x*x-10)/(3*x*x+8*x));

          

    }

     

    int main(){

      double a,b;

      a=1.5;

      int sum=0;

      while(1){

         sum++;

         b=get(a);

         printf("第%i次: %.12f\n",sum,b);

         if(abs(b-a)<N){

                printf("结果是:%.12f\n",b);

                break;

             }

           a=b;

      } 

    }

     

    二分法:

    #include<iostream>

    using namespace std;

    const double N=0.5*0.00001;

    double getData(double x){

           return x*x*x+4*x*x-10;

    }

    void solve(double a,double b){

           int sum=1;

           double xn,fa,fb,fx;

           while(1){

                  xn=(a+b)/2.0;

                  printf("第%i次:  [%.12f,%.12f]   中点值:%.12f\n",sum,a,b,xn);

                  sum++;

                  if((b-a)/2.0<N){

                    printf("结果是:%.12f\n",xn);

                         break;

                  }

                   fa=getData(a);

                   fb=getData(b);

                   fx=getData(xn);

                   if(fa*fx<0){

                        b=xn;

                   }

                  else if(fx*fb<0){

                         a=xn;

                  }

           }

          

    }

    int main(){

           solve(1,2);

    }

     

    实验结果与分析

    牛顿法:

    二分法:

     

     

    讨论、心得(可选):

    从此求解非线性方程组有了新的可编程的方法,运算起来速度快,虽然存在舍入误差。编程技巧也理解的更加深刻了,能够轻松控制小数的精度和输出保留小数位数,学以致用,将数值方法正真和计算机联系起来,并且熟练运用。同时掌握了许多编程排除错误的技巧。同学之间相互讨论,互相帮助,将课堂知识理解的更加透彻。

        可采用自顶向下,逐步细化的编程方式。多将一些求表达式值的功能封装成一个函数,这样可扩展性就强了,而且思路清晰,完成效率高。

     

     

     

    实验名称:线性方程组的直接解法

    实验时间:2018.06.18

    实验目的和要求:

    1.了解Gauss消元法、LU分解法等线性方程组直接求解的基本方法、基本原理;

    2.通过编写程序,进行算法设计和数值求解。

    实验内容和原理:

    利用高斯消元法、LU分解法分别求解下列方程组:

    高斯消元法的基本思想是将原有线性方程组化为与之等价的三角形方程组,这个过程也称为消元过程,再通回代过程进行求解。消元过程使用公式为:

    回代过程使用公式如下:

    下面是关于使用LU分解求解方程组Ax = b:

    当系数矩阵A完成了LU分解后,方程组Ax = b就可以化为L(Ux) = b,等价于求解两个方程组Ly = b和Ux = y;

    具体计算公式为:

     

    主要仪器设备:

    电脑、win10、DevC++运行环境

     

    上机调试修改源程序:

    高斯消元法

    #include<iostream>

    using namespace std;

    const int N=1000;

    double value[N][N];

     int n;

    void xiao(){

           for(int k=1;k<n;++k){

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

                          //取系数

                          double l=value[i][k]/value[k][k];

                           value[i][k]=0;

                         for(int col=k+1;col<=n+1;++col)

                          value[i][col]-=value[k][col]*l;

                  }

                 

           }

    }

    void solve(){

           double ans[N];

           for(int i=n;i>=0;i--){

       //从最后一行开始;

       double sum=0;      

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

                  sum+=value[i][k]*ans[k];

           }

            ans[i] =(value[i][n+1]-sum)/value[i][i];

          

    }

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

     

       printf("第%i个x=%.6f\n",i,ans[i]);

      

    }

    int main(){

            

             cin>>n;

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

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

     cin>>value[i][j];

       xiao();

       solve();

        

    }

    LU分解法

    #include<iostream>

    using namespace std;

    const int N=998;

           double a[N][N];

           double b[N];

                   double l[N][N],u[N][N];

           int n;

     

    void solve(){

           double y[N],x[N];

           double b[N];

           cout<<"请输入n个b值"<<endl;

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

            cin>>b[i];

            

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

                  double temp=0;

                  for(int j=1;j<i;++j){

                         temp+=y[j]*l[i][j];

                  }

                  y[i]=b[i]-temp;

           }

          

           for(int i=n;i>=1;--i)

           {

                  double temp=0;

                  for(int j=n;j>i;--j ){

                         temp+=x[j]*u[i][j];

                  }

                  x[i]=(y[i]-temp)/u[i][i];

           }

           //输出y

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

           printf("y%i=%.6f\n",i,y[i]);

          

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

           printf("x%i=%.6f\n",i,x[i]);

    }            

     

    int main(){

          

           cin>>n;

     

           //输入

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

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

             cin>>a[i][j];

            

            //lu分解

     

            

            //处理第一行和第一列

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

             u[1][j]=a[1][j];

            

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

             l[i][1]=a[i][1]/u[1][1];

            

            //处理剩下的

            int k;

              for( k=2;k<=n;++k){

                  for(int j=k;j<=n;++j){

                          

                          double t1=0;

                  

                  for(int i=1;i<=k-1;++i)

                   t1+=l[k][i]*u[i][j];

                   

                   

                   u[k][j]=a[k][j]-t1;

                   

              }

             

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

               

                  double t2=0;

                   for(int p=1;p<=k-1;++p)

                    t2+=l[i][p]*u[p][k];

                 l[i][k]=(a[i][k]-t2)/u[k][k];

              }

                      

               

            } 

            

            //输出lu

            //先将对角线元素置为1

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

             l[i][i]=1;

            cout<<"L为:"<<endl;

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

            

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

               printf("%.6f ",l[i][j]);

                     cout<<endl;

    }

     cout<<"U为:"<<endl;

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

            

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

               printf("%.6f ",u[i][j]);

               cout<<endl;

                    

    }

     

    //回带

     solve();

            

    }

     

    实验结果与分析

    高斯消元法:

    LU分解法

     

    讨论、心得(可选):

    编写LU分解法的时候花了很长时间,主要是没有快速理清各层变量i、j、k的具体含义。懂了原理之后就能很快的编写程序了,但并不一定能一步成功,还需要后期的调试,和同学适当的讨论可以引发思维的碰撞,帮助我们快速理解和实践。

     

     

    实验名称: 线性方程组的迭代解法

    实验时间:2018.06.20

    实验目的和要求:

    1.了解雅可比迭代法、高斯-赛德尔迭代法等线性方程组迭代求解的基本方法、基本原理;

    2.能够按照工程实际要求,选择适当的算法;

    3.通过编写程序,进行算法设计和数值求解。

     

    实验内容和原理:

    使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。

    雅可比迭代法的公式如下:

    高斯-赛德尔迭代法的公式如下:

    主要仪器设备:

    电脑、win10、DevC++运行环境

     

    上机调试修改源程序:

    高斯-赛德尔迭代法:

    #include<iostream>

    #include<cmath>

    using namespace std;

    const int N=1000;

    const double wucha=0.5*0.000001;

    double x1[N],x2[N],x3[N];

    double fanshu[N];

    int main(){

           printf("第0组:%.6f %.6f %.6f \n",x1[0],x2[0],x3[0]);

           for(int i=1;;++i){

                  x1[i]=              0.1*x2[i-1]+0.2*x3[i-1]+0.72;

                  x2[i]=0.1*x1[i]+              +0.2*x3[i-1]+0.83;

                  x3[i]=0.2*x1[i]+0.2*x2[i]                +0.84;   

                 

                  printf("第%i组:%.6f %.6f %.6f \n",i,x1[i],x2[i],x3[i]);

                 

                  //算误差   2范数

                   

                 

                   fanshu[i]=abs(x1[i])+abs(x2[i])+abs(x3[i]);

                   if(abs(fanshu[i]-fanshu[i-1])<wucha){

                        break;

                   }

           }

          

    }

    实验结果与分析

    高斯-赛德尔迭代法

     

    讨论、心得(可选):

    以后解线性方程组就可以少用克莱姆法则,用计算机迅速求解出来近似值,这种方法在实际生活的建模中非常实用。通过此次试验,不仅感受到了数值方法这门学科的奇妙用处,而且大大提升了我们快速编程能力,为今后的工作打下了坚实的基础。

     

     

     

     

     

    实验名称:代数插值

    实验时间:2018.06.20

    实验目的和要求:

    1.了解拉格朗日插值法或牛顿插值法的基本方法、基本原理;

    2.通过编写程序,进行算法设计和数值求解。

    实验内容和原理:

    使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。

    X

    0.40

    0.55

    0.65

    0.80

    0.90

    1.05

    f(x)

    0.41075

    0.57815

    0.69675

    0.88811

    1.02652

    1.25386

     

    拉格朗日基函数为:

    拉格朗日插值多项式为:

    主要仪器设备:

    电脑、win10、DevC++运行环境

     

    上机调试修改源程序:

    拉格朗日插值法: 

    #include<iostream>

    using namespace std;

    double x[100],y[100];

    int n;

     

    double get(double t){

           double ans=0;

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

           double temp=1;

           for(int j=1;j<=n;++j){

                     if(j!=i)

                          temp*=(t-x[j]) /(x[i]-x[j]);

           }

             ans+=y[i]*temp;

    }

     

       return ans;

    }

    int main(){

    cin>>n;

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

    cin>>x[i]>>y[i];

    printf("%.6f\n",get(0.596));  

    }

    实验结果与分析

     

     

    讨论、心得(可选):

    拉格朗日插值多项式可以快速找出一条过所有插值节点的曲线,在生活中可以帮助我们快速预测或找出事物的相关规律。通过编程,更深层次的掌握了拉格朗日插值的由来,并且提高了自己编程的信心。体会到了用计算机解决问题方便、快捷。

     

     

     

     

     

     

     

    实验名称:最小二乘法拟合多项式

    实验时间:2018.06.22

    实验目的和要求:

    1.了解最小二乘法拟合多项式的基本方法、基本原理;

    2.通过编写程序,进行算法设计和数值求解。

    实验内容和原理:

    给定数据点(xi ,yi),用最小二乘法拟合数据的多项式,并求平方误差。

    xi

    0

    0.5

    0.6

    0.7

    0.8

    0.9

    1.0

    yi

    1

    1.75

    1.96

    2.19

    2.44

    2.71

    3.00

    最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。

     

    主要仪器设备:

    电脑、win10、DevC++运行环境

     

    上机调试修改源程序:

        #include<cstring>

    #include <iostream>

    #include <vector>

    #include <cmath>

    using namespace std;

     

    //最小二乘拟合相关函数定义

    double sum(vector<double> Vnum, int n);

    double MutilSum(vector<double> Vx, vector<double> Vy, int n);

    double RelatePow(vector<double> Vx, int n, int ex);

    double RelateMutiXY(vector<double> Vx, vector<double> Vy, int n, int ex);

    void EMatrix(vector<double> Vx, vector<double> Vy, int n, int ex, double coefficient[]);

    void CalEquation(int exp, double coefficient[]);

    double F(double c[],int l,int m);

    double Em[6][4];

     

    //主函数,这里将数据拟合成二次曲线

    int main(int argc, char* argv[])

    {

           double arry1[7]={0,0.5,0.6,0.7,0.8,0.9,1};

           double arry2[7]={1,1.75,1.96,2.19,2.44,2.71,3};

           double coefficient[7];

           memset(coefficient,0,sizeof(double)*7);

           vector<double> vx,vy;

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

           {

                  vx.push_back(arry1[i]);

                  vy.push_back(arry2[i]);

           }

           EMatrix(vx,vy,7,3,coefficient);

           printf("拟合方程为:y = %lf + %lfx + %lfx^2 \n",coefficient[1],coefficient[2],coefficient[3]);

           return 0;

    }

    //累加

    double sum(vector<double> Vnum, int n)

    {

           double dsum=0;

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

           {

                  dsum+=Vnum[i];

           }

           return dsum;

    }

    //乘积和

    double MutilSum(vector<double> Vx, vector<double> Vy, int n)

    {

           double dMultiSum=0;

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

           {

                  dMultiSum+=Vx[i]*Vy[i];

           }

           return dMultiSum;

    }

    //ex次方和

    double RelatePow(vector<double> Vx, int n, int ex)

    {

           double ReSum=0;

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

           {

                  ReSum+=pow(Vx[i],ex);

           }

           return ReSum;

    }

    //x的ex次方与y的乘积的累加

    double RelateMutiXY(vector<double> Vx, vector<double> Vy, int n, int ex)

    {

           double dReMultiSum=0;

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

           {

                  dReMultiSum+=pow(Vx[i],ex)*Vy[i];

           }

           return dReMultiSum;

    }

    //计算方程组的增广矩阵

    void EMatrix(vector<double> Vx, vector<double> Vy, int n, int ex, double coefficient[])

    {

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

           {

                  for (int j=1; j<=ex; j++)

                  {

                         Em[i][j]=RelatePow(Vx,n,i+j-2);

                  }

                  Em[i][ex+1]=RelateMutiXY(Vx,Vy,n,i-1);

           }

           Em[1][1]=n;

           CalEquation(ex,coefficient);

    }

    //求解方程

    void CalEquation(int exp, double coefficient[])

    {

           for(int k=1;k<exp;k++) //消元过程

           {

                  for(int i=k+1;i<exp+1;i++)

                  {

                         double p1=0;

     

                         if(Em[k][k]!=0)

                                p1=Em[i][k]/Em[k][k];

     

                         for(int j=k;j<exp+2;j++)

                                Em[i][j]=Em[i][j]-Em[k][j]*p1;

                  }

           }

           coefficient[exp]=Em[exp][exp+1]/Em[exp][exp];

           for(int l=exp-1;l>=1;l--)   //回代求解

                  coefficient[l]=(Em[l][exp+1]-F(coefficient,l+1,exp))/Em[l][l];

    }

    //供CalEquation函数调用

    double F(double c[],int l,int m)

    {

           double sum=0;

           for(int i=l;i<=m;i++)

                  sum+=Em[l-1][i]*c[i];

           return sum;

    }

     

    实验结果与分析

     

    讨论、心得(可选):

    编程不是一日练成的,需要每天坚持,这样写代码才有感觉。编写一个大的系统往往很困难,但我们可以把它逐步细化、分解成一个个小的模块,然后精细的设计每一个小的模块,采用自顶向下,逐步细化的方法。遇到不懂的问题,查查等级高的博客,往往会有新思路和高效的解法。c/c++中包含很多库函数,不必要每个都记住,用的时候查询STL就行了。

    在程序设计中,和同学多多交流,会有意想不到的收获,例如:两种方法,会有更优的解决方案。

    现在越来越体会到数值计算方法和我们的生活很贴近,非常方便有用。

     

     

     


    展开全文
  • 计算方法 实验二 非线性方程求根

    千次阅读 2017-11-14 14:48:51
    设方程f(x)=x^3-3x-1=0 有三个实根X1=18739,X2=-0.34727,X3=-1.53209,现采用下面六种不同计算格式,求f(x)=0的根X1,X2; 二、要求 1、编制一个程序进行运算,最后打印出每种迭代格式的敛散情况; 2、用事后误差...
  • 数值计算方法实验数值计算方法实验数值计算方法实验数值计算方法实验数值计算方法实验数值计算方法实验数值计算方法实验数值计算方法实验数值计算方法实验数值计算方法实验
  • 江苏科技大学计科专业,计算方法实验,插值方法实验代码包,详细过程。
  • 实验要求用六种计算方式计算非线性方程的根 废话不多说 代码如下 #include #include #include using namespace std; const double eps=1e-10; const int MAXN=2000; /*double f(double x) {  return x*x*x-3*x...
  • 实验目的:练习用数值方法求解给定的非线性方程。 实验内容:用牛顿法计算 ,要求结果为具有4位有效数字的近似数。
  • 2020哈工大计算方法课程实验(数值分析实验)之拉格朗日Lagrange插值多项式
  • 一.试验目的:练习用数值方法求逆矩阵。 二.实验内容:求下面矩阵的逆矩阵: .

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 376,622
精华内容 150,648
关键字:

计算方法实验