精华内容
下载资源
问答
  • 2009-10-23 10:29:00

    // test_2.cpp : Defines the entry point for the console application.
    //自动选步长的梯形算法计算定积分

     

    #include "stdafx.h"
    #include <iostream>
    #include <math.h>

     

    double TR(double a, double b, double err);
    //给定区间端点a和b,误差界err和计算被积函数f(x)的子程序,算法TR用自动选步长的梯形算法计算定积分I,函数返回值即为I
    double f(double x);
    //计算被积函数f(x)的子程序

     

    int _tmain(int argc, _TCHAR* argv[])
    {
        using namespace std;
        cout.precision(8);
        cout << "I = " << TR(0, 3.1415926/2, 0.00001) << endl;

        return 0;
    }

     

    double TR(double a, double b, double err)
    {
        double h1 = 0.0, h2 = 0.0, S = 0.0, x = 0.0, Tn =0.0, T2n = 0.0;

     

        h1 = b - a;
        Tn = h1 * (f(a) + f(b)) / 2;

     

        //先执行一遍
        h2 = h1 / 2;
        S = 0.0;
        x = a + h2;
        while( x < b )
        {
            S += f(x);
            x += h1;
        }
        T2n = ( Tn + h1 * S ) / 2;
        //输出每一个T2n
        std::cout.precision(8);
        std::cout << T2n << std::endl;

     

        while( abs(T2n - Tn) >= err )
        {
            Tn = T2n;
            h1 = h2;

            h2 = h1 / 2;
            S = 0.0;
            x = a + h2;
            while( x < b )
            {
                S += f(x);
                x += h1;
            }
            T2n = ( Tn + h1 * S ) / 2;
            //输出每一个T2n
            std::cout << T2n << std::endl;
        }

        return T2n;
    }

     

    double f(double x)
    {
        return ( sin(x) / (1 + x * x));
    }

     

    算法原理见《计算方法教程(第2版)》,凌永祥,陈明奎。西安交通大学出版社。2005年4月第二版。第144页。

    更多相关内容
  • 复化梯形公式的原与实现毕业论文目录...53复化梯形公式的算法原理 ………………………………………………63.1复化梯形公式的主要思想……………………………………………63.2复化梯形公式的计算方法…………………...

    复化梯形公式的原与实现毕业论文

    目录

    摘要……………………………………………………………………………4

    1前言 …………………………………………………………………………5

    2 复化梯形公式的提出背景…………………………………………………5

    3复化梯形公式的算法原理 ………………………………………………6

    3.1复化梯形公式的主要思想……………………………………………6

    3.2复化梯形公式的计算方法……………………………………………6

    3.3复化梯形公式的积分余项……………………………………………6

    4算法流程图…………………………………………………………………7

    5 C语言算法程序……………………………………………………………8

    6算法实现

    6.1算法实例………………………………………………………………9

    6.2利用MATLAB计算误差的例子………………………………………11

    7总结…………………………………………………………………………13

    8参考文献……………………………………………………………………13

    摘要

    利用若干小梯形的面积代替原方程的积分,利用微元法,可以求出坐标面上由函数与坐标轴围城的图像的面积的近似值。设将求积区间分成等份,则一共有个分点,按梯形公式计算积分值,需要提供个函数值。整个区间上的复化梯形公式即 利用复化梯形公式计算和函数,此外也通过实例分析运用这种方法会产生怎样的误差。

    关键字:分点 函数值

    前言

    在工程计算中,某些定积分的近似值被广泛应用。我们在求一些具体的数值时,往往对精度的要求很高,用求积公式计算精确度的方法有很多,各有优缺点。通过对几种常见的方法加以比较,得出一些具体的选择方法,为提高计算精确度减少了很多复杂的运算。像复化梯形公式适用对精度不高的运算, 比复化梯形公式计算复杂,但结果比复化梯形求积公式计算的精确度要高,更适应精确度的运算,龙贝格计算积分时,不仅可以减少运算量,也可以提高近似值的精确度。此次主要讨论复化梯形的一些知识。

    复化梯形公式的提出背景

    根据人们所熟知的微积分基本定理,对于积分,只要找到被积函数的原函数,便有下列Newton-Leibniz公式:.但实际使用这种求积方法往往有困难,一方面的原函数不易求得 ,或非常复杂像有很多的被积函数,例如,等等,找不到用初等函数表示的原函数;另一方面,函数 是用函数表形式给出而没有解析式 , Newton-Leibniz公式也不能直接运用,这时就采用定积分的数值计算方法 ,以解决定积分的近似计算。此外在一些应用中数值求积公式的应用不仅在近似计算本身 ,在初等数学中 ,某些数列求前 n项之和公式的推导颇为繁琐 ,应用复化梯形公式可方便地导出这些公式。复化梯形公式用牛顿——Newton-Leibniz公式来计算的值的前提是 :的原函数能够求出。当 的原函数不易求出或找不到时 ,希望用一个易于求原函数的函数来近似代替被积函数 ,从而得到定积分的近似计算公式。下文中梯形公式就是常用的近似计算公式。由定积分的几何意义可知,梯形的面积近似的代替曲边梯形的面积。如果在整个区间上,只用单独一个梯形,由求梯形面积公式算出的结果为:T=(b-a)/2*[f(a)+f(b)]作为的近似值,往往达不到精度要求,因此通常采用的方法是细分求积区间。

    三、复化梯形公式的算法原理

    3.1复化梯形公式的主要思想:

    利用小梯形的面积代替原方程的积分,利用微元法,可以求出坐标面上由函数与坐标轴围城的图像的面积的近似值,符合了计算机计算存储的思想。设将求积区间分成等份,则一共有个分点,按梯形公式计算积分值,需要提供个函数值。在区间内插入一列分点,使a= <

    3.2复化梯形公式的计算方法:

    每个小区间上梯形公式是

    注意,这里 代表步长,分点为,

    整个区间上的复化梯形公式是

    3.3复化梯形公式的积分余项:

    由于 ,且

    故存在使

    所以复化梯形公式的积分余项为

    ,

    四、算法流程图:

    五、C语言算法程序

    #include

    #include

    #include

    using namespace std;

    #define N 400

    float F(float x)

    {

    x=exp(x) ;

    return (x )

    展开全文
  • 实验三:分别用复化梯形公式和复化辛卜生公式计算f(x)=sin(x)/x的积分,并与准确值比较判断精度。#include#include#includedouble Trapezoid(float,float,float,int);double Simpson(float,float,float,int);double ...

    实验三:分别用复化梯形公式和复化辛卜生公式计算f(x)=sin(x)/x的积分,并与准确值比较判断精度。

    #include

    #include

    #include

    double Trapezoid(float,float,float,int);

    double Simpson(float,float,float,int);

    double Integral(float,float);

    int SigDigT(double,double,int);

    void Euler(float a[50],float b);

    float f(float);

    float Bisection(float,float);

    main()

    {char q;

    double d1,d2;

    float a,b,h1,h2;

    int i,m,n;

    printf("\t\t\t实验三:数值积分\n");

    printf("实验题目:分别用复化梯形公式和复化辛卜生公式计算f(x)=sin(x)/x的积分,并与准确值比较判断精度。\n\n");

    printf("请输入定积分的上下限:\n");

    printf("定积分下限:a=");

    scanf("%f",&a);

    printf("定积分上限:b=");

    scanf("%f",&b);

    if(a==b)

    {printf("积分上下限相等,定积分的值为0。\n");

    goto sign1;}

    else

    printf("请输入复化梯形公式划分的份数: ");

    scanf("%d",&n);

    printf("请输入复化辛卜生公式划分的份数:");

    scanf("%d",&m);

    h1=(b-a)/n;

    h2=(b-a)/m;

    printf("复化梯形公式的步长为: h=%f\n",h1);

    printf("复化辛朴生公式的步长为: h=%f\n",h2);

    printf("复化梯形公式的结果是:\nT=%f\n",Trapezoid(a,b,h1,n));

    printf("复化辛卜生公式的结果是:\nS=%f\n",Simpson(a,b,h2,m));

    printf("定义计算该公式的结果是:\nI=%f\n",Integral(a,b));

    d1=fabs(Integral(a,b)-Trapezoid(a,b,h1,n));

    d2=fabs(Integral(a,b)-Simpson(a,b,h2,m));

    printf("复化梯形公式的误差是:\nd=%f\n",d1);

    printf("复化辛卜生公式的误差是:\nd=%f\n",d2);

    if(d1>d2) printf("复化梯形公式的精度高于复化辛卜生公式的精度\n");

    else if(d1==d2) printf("复化辛卜生公式和复化梯形公式的精度相等\n");

    else printf("复化辛卜生公式的精度高于复化梯形公式的精度\n");

    for(i=0;i

    {if(i==0) printf("划分%d份的复化梯形公式的有效位数是小数点后的第%d位\n",n,SigDigT(d1,d2,i));

    else printf("划分%d份的复化辛卜生公式的有效位数是小数点后的第%d位\n",m,SigDigT(d1,d2,i));}

    sign1:

    printf("\n是否继续?(y/n)\n");

    printf("注:选y 重新输入,选n 返回主界面\n");

    getchar();

    q=getchar();

    if(q=='y')

    system("cls");

    else if(q=='n')

    {system("cls");

    main();}

    else {printf("您输入的字符不可识别,请重新输入!\n");

    goto sign1;}}

    double Trapezoid(float a,float b,float h1,int n)

    {double x,y,t=0;

    int i;

    for(i=1;i

    {x=a+i*h1;

    if(x==0) y=2;

    else y=2*(sin(x)/x);

    t=t+y;}

    if(a==0) t=t+1+sin(b)/b;

    else if(b==0) t=t+1+sin(a)/a;

    else t=t+sin(a)/a+sin(b)/b;

    t=(h1/2)*t;

    return t;}

    double Simpson(float a,float b,float h2,int m)

    {double x,y,s=0;

    int i;

    for(i=1;i

    {x=a+i*h2;

    if(x==0) y=2;

    else y=2*(sin(x)/x); s=s+y;}

    for(i=0;i

    {x=a+((1+2*i)*h2)/2; if(x==0) y=4;

    else y=4*(sin(x)/x); s=s+y;}

    if(a==0) s=s+1+sin(b)/b; else if(b==0) s=s+1+sin(a)/a; else s=s+sin(a)/a+sin(b)/b; s=(h2/6)*s;

    return s;}

    double Integral(float a,float b) {double h,x,y,I=0;

    int n=500000;

    h=(b-a)/500000;

    for(n=0;n

    if(x==0) y=1;

    else y=sin(x)/x;

    I=I+y*h;}

    return I;}

    SigDigT(double d1,double d2,int i) {int j=0,k=0;

    double r=1,t;

    if(i==0)

    {do{r=r*(0.1);

    t=d1/r;

    j++;}while(t

    else

    {do{r=r*(0.1);

    t=d2/r;

    j++;}while(t

    展开全文
  • 数值分析C++实现用复化梯形公式

    千次阅读 2020-05-05 00:59:47
    算法描述 (1)计算步长h =(b-a)/n (2)计算sum1 = f(a)+f(b) (3)从 i =1开始计算 h = a+ih,计算f(a+ih)的累加和直到i = n-1得到累加和 sum2 (4)计算 I = h*(sum1+2*sum2)/2,即得出结果积分I 源程序代码及运行结果截图...

    在这里插入图片描述
    在这里插入图片描述
    算法描述
    (1)计算步长h =(b-a)/n
    (2)计算sum1 = f(a)+f(b)
    (3)从 i =1开始计算 h = a+ih,计算f(a+ih)的累加和直到i = n-1得到累加和 sum2
    (4)计算 I = h*(sum1+2*sum2)/2,即得出结果积分I
    源程序代码及运行结果截图

    #include<iostream>
    #include<vector>
    #include<math.h>
    #include<iomanip>
    #include<string>
    using namespace std;
    struct Point
    {
    	Point(float x, float y) {
    		this->x = x;
    		this->y = y;
    	}
    	Point() {
    	}
    	float x;			//坐标的x轴
    	float y;			//坐标的y轴
    	int k = -1;          //给每个已知点进行编号,表示第k个点,k = 0,1,2....n
    };
    //存放已知点编号完成后的动态向量
    vector<Point> *vec = NULL;
    /*
    @param points  要初始化的已知点数组
    @param len 数组长度
    */
    void init(Point points[], int len)
    {
    	vec = new vector<Point>();
    	for (int i = 0; i < len; i++)
    	{
    		//给每个点进行编号处理
    		points[i].k = i;
    		//将每个点放入到向量集合中
    		vec->push_back(points[i]);
    	}
    }
    /*
    获取x值对应的函数值
    @param x : 自变量x
    @return 返回自变量x对应的y值
    */
    float getFunctionValue(float x) 
    {
    	return sin(x)/x;
    }
    /*
    获取积分值
    @param a : 积分变量起始位置
    @param b : 积分变量结束位置
    @param n :  积分区间等距分为n份
    */
    float getResult1(float a, float b, int n)
    {
    
    	//步长 h 
    	float h = (b - a) / n;
    	//用于保存结果
    	float result = 0.0f;
    	//首先计算f(a)+f(b)
    	result += getFunctionValue(a) + getFunctionValue(b);
    	//开始计算2*f(a+i*h),i=1,2,3...n-1的累加值
    	for (int i = 1; i < n; i++) {
    		result += getFunctionValue(a+i*h) * 2;
    	}
    	//计算最终结果
    	result = result * h / 2;
    	return result;
    }
    
    /*
    获取x值对应的函数值
    @param a : 积分变量起始位置
    @param b : 积分变量结束位置
    @param n :  积分区间等距分为n份
    */
    float getResult(float a, float b,int n)
    {
    	
    	//步长 h 
    	float h = (b - a)*1.0f / n;
    	//用于保存结果
    	float result = 0.0f;
    	//首先计算f(a)+f(b)
    	result += (*vec)[0].y + (*vec)[n].y;
    	//开始计算f(x0)+2*(f(x1)+f(x2)+...+f(xn-1))+f(xn)的累加值
    	for (int i = 1; i < n;i++) {
    		result += (*vec)[i].y * 2;
    	}
    	//计算最终结果
    	result = result * h / 2;
    	return result ;
    }
    
    
    int main()
    {
    	//测试数据
    	Point p1(0.0f, 1.0f);
    	Point p2(0.125f, 0.997f);
    	Point p3(0.250f, 0.990f);
    	Point p4(0.375f, 0.977f);
    	Point p5(0.5f, 0.954f);
    	Point p6(0.625f, 0.936f);
    	Point p7(0.750f, 0.909f);
    	Point p8(0.875f, 0.877f);
    	Point p9(1.0f, 0.841f);
    	Point points[9] = { p1,p2,p3,p4,p5,p6,p7,p8,p9 };
    
    	init(points, 9);
    	cout << "复合梯形公式求得f(x)=sinx/x在区间[10^-20,1.0]上的积分I=" << getResult1(1e-20, 1.0f, 8) << endl;
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述

    展开全文
  • 这里介绍变步长复化梯形算法和龙贝格算法 变步长复化梯形算法 基本原理就是在求积区间内用梯形公式求积分,如果精度不够,我们就把区间长度对半分,更加细致,重复计算。直至本次计算的结果与之前计算的结果之差...
  • 变步长的Simpson公式计算积分.算法基本分析:输入a,b(积分上下限),n为积分区间等分数,eps为计算精度,我这里1/...变步长梯形求积算法计算积分,本题目取的例子为数值书131面的例子2,f(x)= sin(x)/x,下面给出代码:
  • 步长梯形公式.doc

    2021-05-20 10:47:07
    实验七 变步长梯形公式(一)实验目的掌握变步长梯形公式的应用。(二)实验项目内容1.写出变步长梯形公式步骤和流程图。2.对算法用C程序或C#、C++实现。3.调试程序。(三)主要仪器设备微机(四)实验室名称公共计算机...
  • 编程实现数值积分的几种--方法c语言 编程实现数值积分的几种--方法 c语言 数值计算 2010-11-05 09:52:43 阅读385 评论1 字号:大中小 订阅 复化梯形公式 在区间 不大时 , 用梯形公式、辛卜生公式计算定积分是简单...
  • 满意答案likuenbo2015.06.17采纳率:57%等级:8已帮助:160人复合梯形公式的C++代码:123456789101112131415161718192021222324#include#include<math.h>usingnamespacestd;doublefun(doublex){return(x*sin(x...
  • 假设被积函数为fx,积分区间为,ab,把区间,ab等分成n个小区间,各个区间的长度为h,即/hban,称之为“步长”。根据定积分的定义及几何意义,定积分就是求函数fx在区间,ab中图线下包围的...
  • 步长算法 MPPT算法在运行时,主要分为两个阶段:当由于光照变化而导致工作点远离MPP时,MPPT算法需要重新追踪新的MPP,此过程被称为动态阶段(dynamic stage);而当MPPT算法找到MPP时,MPPT算法需要在MPP处进行...
  • C语言实现变步长求积分算法

    千次阅读 2018-10-26 09:46:30
    链接:https://blog.csdn.net/chen_dsir/article/details/71257631 博主详细介绍了复合梯形公式, 链接:https://wenku.baidu.com/view/b300c53deefdc8d376ee3228.html 详细介绍了变步长的目的,以及变换的方式 ...
  • 第五次实验报告

    2021-05-19 19:22:15
    c语言程序报告姓名:吴波实验地点:第一教学楼514教室实验时间:5月16日实验项目:1、利用复化梯形公式计算定积分2、计算Ackerman函数3、编写计算x的y次幂的递归函数getpower(int x,int y)。并在主程序中实现输入...
  • 自适应复化辛普森公式求积算法C语言实现)利用复化辛普森公式求积分自适应步骤基于C语言实现的代码 利用复化辛普森公式求积分自适应步骤 h为步长,a为积分下限,b为积分上限,f为积分函数,n为划分的积分次数,ε...
  • 算法基本原理:把原区间分为一系列小期间(n份),在每个小区间上都用小的梯形面积来近似代替原函数的积分,当小区间足够小时,就可以得到原来积分的近似值。但是这个过程中有一个问题是步长的取值,步长太大精度难以...
  • 步长梯形积分法 c语言版 源码 自用上传做贡献
  • 简单的龙贝格算法和变步长梯形算法,包含算法时间比较,供初学者参考...
  • 算法程序集(C语言描述)(第五版)+源代码 第1章 多项式的计算 1.1 一维多项式求值 1.2 一维多项式多组求值 1.3 二维多项式求值 1.4 系数多项式求值 1.5 多项式相乘 1.6 系数多项式相乘 1.7 多项式相除 1.8 ...
  • 算法程序集(C语言描述)(第三版)+源代码 第1章 多项式的计算 1.1 一维多项式求值 1.2 一维多项式多组求值 1.3 二维多项式求值 1.4 系数多项式求值 1.5 多项式相乘 1.6 系数多项式相乘 1.7 多项式相除 1.8 ...
  • 步长梯形

    2015-09-16 22:47:00
    数值计算,变步长梯形法求积分,C语言源代码
  • 掌握复化梯形公式、辛扑生公式等牛顿-柯特斯公式计算积分。2. 会用高斯公式计算积分。3. 掌握数值微分的计算方法。二 实验内容1.分别用复化梯形公式和辛扑生公式计算积分。M=42.用高斯公式(n=3)3.给定下列...
  • 龙贝格算法C语言实现算法理论注意点算法应用实例实例解读实例代码思路分析(1)梯形公式函数 $T$ 部分:(2)龙贝格算法实现 $Integral$ 部分Step1:Step2:代码交流思考交流新的改变功能快捷键合理的创建标题,有助于...
  • C语言基础】利用复合梯形求积公式计算定积分 一、复合梯形求积公式 这是数值分析中一种求解定积分的近似方法。适用于被积函数的原函数不能用初等函数表示的情况。 基本思路 将被积函数 f(x)与x轴围成的区域分成n...
  • 计算方法-第4-3、数值积分与数值微分(龙贝格求积公式)华长生制作 * 第四章 数值积分 4.4 龙贝格算法 4.4.1 梯形法的递推 由上节讨论得知加密节点可以提高求积公式的精度,复化 求积方法对提高精度是行之有效的,但...
  • 数值方法中用复合积分公式求积分,c++编码,已调试成功。
  • C语言积分的资料收集C语言积分Trapezoidal RuleSimpson's Rule...实用的算法分为梯形算法(Trapezoidal Rule)和辛普森算法(Simpson’s Rule),那么区别和性能呢?本文的图形都来自文献Integration Trapezoidal
  • 若用复化梯形公式、复化辛普森公式和复化高斯-勒让德公式计算,要求绝对误差限 ,分别利用它们的余项对每种算法做出步长的事前估计; 分别用复化梯形公式、复化辛普森公式和复化高斯-勒让德公式计算; 将计算结果与...
  • VS2017/c语言-求积分算法

    千次阅读 2020-12-21 14:23:49
    c语言计算积分 一、积分计算原理 先把积分区域划分为n个曲边梯形,每个求值点为曲边梯形的两个底边中点,求得每个曲边梯形的面积即为积分值 用近似法求得积分:当n为无穷大时,可将该曲边梯形近似看成矩形,求出求...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 164
精华内容 65
关键字:

c语言自动选步长的复化的梯形算法