当前位置: 首页 > news >正文

计算方法实验六 数值积分

【实验性质】综合性实验。

【实验目的】理解插值型积分法;掌握复化积分法算法。 

【实验内容】

1对 ,用复化梯形积分和变步长梯形积分求值(截断误差不超过)。

【理论基础】

积分在工程中有重要的应用,数值积分的基本思想是用被积函在区间上的一些点处的值 的线性组合作为积分的近似值:

实际应用中 f x( )是未知的,一般用 f x( ) 的次数不超过n的插值多项式来代替(插值型求积方法):

【实验过程】

1.用复化梯形积分求解,给出代码,并用表格记载求解过程〔区间数n=30、50、70、100、150〕。

程序代码:

头文件:

#ifndef DEFINITEINTEGRAL_H

#define DEFINITEINTEGRAL_H

#include<math.h>

class definiteintegral

{

public:

    definiteintegral();

    double T_Integral(double a ,double b,double(*f)(double));

    double S_Integral(double a ,double b,double(*f)(double));

    double C_Integral(double a ,double b,double(*f)(double));

    double Tn_Integral(double a ,double b,double(*f)(double),int n);

    double Sn_Integral(double a ,double b,double(*f)(double),int n);

    double Cn_Integral(double a ,double b,double(*f)(double),int n);

    double V_T_Integral(double a, double b, double(*f)(double),double e);

};

#endif // DEFINITEINTEGRAL_H

主函数:

//实验六

#include <iostream>

#include <windows.h>

#include "colvector.h"

#include "matrix.h"

#include <windows.h>

#include "linearequations.h"

#include "interpolationpolynomial.h"

#include "definiteintegral.h"

double f1(double x){

    return x*x*x-sin(x)-4*x-1;

}

double f2(double x){

    return 3*x*x-cos(x)-4;

}

double f3(double x){

    double result =sin(x)+4*x-1;

        if(result>0){

            return pow(result,1.0/3);

        }else{

             return -pow(fabs(result),1.0/3);

        }

}

using namespace std;

double f4(double x)

{

    return 1/(1+x*x);

}

int main()

{

    SetConsoleOutputCP(CP_UTF8);

    double a=0,b=1.0;

    definiteintegral obj;

    cout<<"梯形积分:\t\t"<<obj.T_Integral(a,b,f4)<<endl;

    cout<<"Simpson积分:\t\t"<<obj.S_Integral(a,b,f4)<<endl;

    cout<<"Cotess积分:\t\t"<<obj.C_Integral(a,b,f4)<<endl;

    cout<<endl;

    cout<<"复化梯形积分:\t\t"<<obj.Tn_Integral(a,b,f4,150)<<endl;

    cout<<"复化Simpson积分:\t"<<obj.Sn_Integral(a,b,f4,30)<<endl;

    cout<<"复化Cotes积分:\t\t"<<obj.Cn_Integral(a,b,f4,30)<<endl;

    cout<<endl;

    cout<<"交步长梯形积分:\t\t"<<obj.V_T_Integral(a,b,f4,0.00001)<<endl;

    return 0;

}

代码块:

#include "definiteintegral.h"
definiteintegral::definiteintegral(){}
double definiteintegral::T_Integral(double a,double b,double(*f)(double)){
    return (b-a)/2.0*(f(a)+f(b));
}
double definiteintegral::S_Integral(double a,double b,double(*f)(double)){
    return (b-a)/6.0*(f(a)+4*f((a+b)/2)+f(b));
}
double definiteintegral::C_Integral(double a,double b,double(*f)(double)){
    double h=(b-a)/4.0;
    return (b-a)/90*(7*f(a)+32*f(a+h)+12*f(a+2*h)+32*f(a+3*h)+7*f(b));
}
double definiteintegral::Tn_Integral(double a,double b,double(*f)(double),int n){
    double h=(b-a)/n;
    double result =0;
    double sum=0;
    for(int i=1;i<=n-1;i++){
            sum +=f(a+i*h);
    }
    result =h/2.0*(f(a)+2*sum+f(b));
    return result;
}
double definiteintegral::Sn_Integral(double a,double b,double(*f)(double),int n){
    double h=(b-a)/n;
    double result =0;
    double sum1=0,sum2=0;
    for(int i=1;i<=n;i++){
            sum1 +=f(a+(i-1)*h+h/2);
    }
    for(int i=1;i<=n-1;i++){
            sum2 +=f(a+i*h);
    }
    result =h/6.0*(f(a)+4*sum1+2*sum2+f(b));
    return result;
}
double definiteintegral::Cn_Integral(double a,double b,double(*f)(double),int n){
    double h=(b-a)/n;
    double result =0;
    double sum1=0,sum2=0,sum3=0,sum4=0;
    for(int i=1;i<=n;i++){
            sum1 +=f(a+(i-1)*h+h/4);
    }
    for(int i=1;i<=n;i++){
            sum2 +=f(a+(i-1)*h+h/2);
    }
    for(int i=1;i<=n;i++){
            sum3 +=f(a+(i-1)*h+3*h/4);
    }
    for(int i=1;i<=n-1;i++){
            sum4 +=f(a+i*h);
    }
    result =h/90.0*(7*f(a)+32*sum1+12*sum2+32*sum3+14*sum4+7*f(b));
    return result;
}
 
double definiteintegral::V_T_Integral(double a, double b, double(*f)(double),double e){
 
    double h=(b-a);
    double T1=h/2.0*(f(a)+f(b));
    double T2=T1/2.0+h/2.0*f(a+h/2.0);
    double error=fabs(T2-T1);
    while(error>=e){
        T1=T2;
        h=h/2;
        double x=a+h/2;
        double sum=0;
        while(x<b){
            sum+=f(x);
            x+=h;
        }
        T2=T1/2.0+h/2.0*sum;
        error=fabs(T2-T1);
    }
    return T2;
}
 

表格:

n=30
n=50
n=70
n=100
n=150
0.785352
0.785381
0.785390
0.785394
0.785396

 

2.用变步长梯形积分求解,给出代码,并用表格记载求解过程。

代码块:

double definiteintegral::V_T_Integral(double a, double b, double(*f)(double),double e){
 
    double h=(b-a);
    double T1=h/2.0*(f(a)+f(b));
    double T2=T1/2.0+h/2.0*f(a+h/2.0);
    double error=fabs(T2-T1);
    while(error>=e){
        T1=T2;
        h=h/2;
        double x=a+h/2;
        double sum=0;
        while(x<b){
            sum+=f(x);
            x+=h;
        }
        T2=T1/2.0+h/2.0*sum;
        error=fabs(T2-T1);
    }
    return T2;
}

表格:

3.比较复化积分与变步长积分,分析实验出现的问题,总结解决办法。

    复化积分是将一个区间分成若干子区间,然后在每个子区间上应用数值积分方法。它的优点是简单易实现,计算结果比较稳定。但是,如果子区间的数量不够多,或者函数在某些子区间上变化较大,可能会导致计算结果的误差较大。为了解决这个问题,可以增加子区间的数量,或者使用自适应方法,根据函数的变化情况来调整子区间的数量。

变步长积分是根据函数的变化情况,调整积分步长来提高计算精度。它的优点是能够更好地适应函数的变化情况,减小误差。但是,如果调整步长的策略不合理,可能会导致计算时间过长。为了解决这个问题,可以采用适当的步长调整策略,如自适应选取步长或者根据函数的一阶或二阶导数来调整步长。

【实验心得】

在本次实验中,我们学习了三种数值积分的方法,包括差值积分法、复化积分法和复化梯形公式。通过这些实验,我对数值积分的原理和计算方法有了更深入的了解。

在差值积分法中,我们使用了牛顿-科特斯公式对函数进行了差值,然后通过对差值多项式进行求和来计算积分。这种方法的优点是计算简单,适用于低次多项式的积分,但对于高次多项式的积分误差较大。

复化积分法是将计算区间分成若干小区间,然后对每个小区间应用数值积分方法。我们采用了复化梯形公式,其原理是通过将每个小区间近似为梯形来计算积分。这种方法误差较差值积分法要小,但计算较复杂。

综合考虑精度和计算复杂度,我们可以选择合适的数值积分方法。如果函数是低次多项式,可以使用差值积分法进行计算。对于复杂函数,可以采用复化积分法进行分区间计算。通过这些实验,我掌握了数值积分的基本原理和计算方法,并且了解了不同方法的优缺点,这对于解决实际问题具有重要的参考价值。

得    分_____________

 

评阅日期_____________

 

教师签名_____________

相关文章:

  • TimSort算法解析
  • Linux的系统周期化任务
  • Hive进阶之路
  • 阿里云服务器全栈技术指导手册(2025版)
  • MATLAB实现二氧化硅和硅光纤的单模光波特性与仿真
  • 大连理工大学选修课——图形学:第三四章 基本图形生成算法
  • LLM-Based Agent及其框架学习的学习(三)
  • 笔记整理六----OSPF协议
  • Android Framework学习三:zygote剖析
  • idea创建springboot项目无法创建jdk8原因及多种解决方案
  • 外观模式(Facade Pattern)
  • 字符串匹配 之 KMP算法
  • 【五一培训】Day 3
  • 【React】 Hooks useTransition 解析与性能优化实践
  • SecureCRT设置自定义快捷键
  • 【Java项目脚手架系列】第一篇:Maven基础项目脚手架
  • 软考-软件设计师中级备考 9、存储管理
  • RR(Repeatable Read)级别如何防止幻读
  • 健康养生指南:科学守护身心
  • go实现循环链表
  • 今晚上海地铁1、2、10、17号线加开定点班车至次日0点
  • G40迎来返程大车流,今明两日预计超13万辆车经长江隧桥进沪
  • 苏州一直升机坠落致1死4伤,事故调查正展开
  • 巴菲特执掌60年,伯克希尔市值如何增长5.5万倍?详解五大经典投资案例
  • 华尔兹转岗与鲁比奥集权:特朗普政府人事震荡背后的深层危机
  • 孙一凡的东欧狂想音乐会:一场穿越东欧的听觉绮梦