C语言求函数定积分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言求函数定积分相关的知识,希望对你有一定的参考价值。
Auto.h中的内容:
#include<stdio.h>
#include<math.h>
#include<string.h>
#define g 9.81
#define e 2.71828182845904523536028747135266249775724709369995
#define F float
#define SC scanf
#define SCS scanf_s
#define PR printf
#define D "%d\n"
#define PF "%f\n"
#define D2 D D
void swap( int * , int * );
void swap(int *ph1,int *ph2)
int temp;
temp=*ph1;
*ph1=*ph2;
*ph2=temp;
___________________________分割线_____________________________
定积分.c中的内容:
#include"C:\Users\Administrator\Programs\Header\Auto.h"
F f1( F );
F f2( F );
F f3( F );
F f4( F );
F f5( F );
F integral( F , F , F(*pt)( F ) , F );
void main()
int type;
F u_limit,l_limit,precision=0.0000001,(*p_pt)(F);
PR("请输入类型(1~5):\n");
SCS("%d",&type);
switch(type)
case 1: p_pt=f1;break;
case 2: p_pt=f2;break;
case 3: p_pt=f3;break;
case 4: p_pt=f4;break;
case 5: p_pt=f5;break;
default:PR("ERROR!");
PR("输入积分上限:\n");
SCS("%f",&u_limit);
PR("输入积分下限:\n");
SCS("%f",&l_limit);
PR("定积分值为:%f\n",integral(u_limit,l_limit,p_pt,precision));
F f1(F x1)
return(1+x1);
F f2(F x2)
return(2*x2+3);
F f3(F x3)
return(pow(e,x3)+1);
F f4(F x4)
return(pow((1+x4),2));
F f5(F x5)
return(pow(x5,3));
F integral(F ul,F ll,F (*pt)(F x),F pc)
F sum=0;
int counter;
for(counter=0;counter*pc+ll<=ul;counter++)
sum+=pc*(*pt)(ll+counter*pc);
return(sum);
_________________________运行报告____________________________
1>------ 已启动生成: 项目: 定积分, 配置: Debug Win32 ------
1>生成启动时间为 2011/8/14 9:29:07。
1>InitializeBuildStatus:
1> 正在创建“Debug\定积分.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
1>ClCompile:
1> 定积分.c
1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(11): warning C4305: “初始化”: 从“double”到“float”截断
1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(39): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(43): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(47): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
1>ManifestResourceCompile:
1> 所有输出均为最新。
1>Manifest:
1> 所有输出均为最新。
1>LinkEmbedManifest:
1> 所有输出均为最新。
1> 定积分.vcxproj -> C:\Users\Administrator\Programs\C\定积分\Debug\定积分.exe
1>FinalizeBuildStatus:
1> 正在删除文件“Debug\定积分.unsuccessfulbuild”。
1> 正在对“Debug\定积分.lastbuildstate”执行 Touch 任务。
1>
1>生成成功。
1>
1>已用时间 00:00:00.43
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
程序能通过编译,且运行时不崩溃,但算出来的结果不准确,有时候直接就不出结果,请高人指正
还有楼主对自然对数e的define也已经超过了计算机的可识别范围。。您那样精确的定义e并不会在结果上获得更加精确地结果,其实反倒会起到相反的作用,要知道与其用一个这样可能导致内存出错以及必定会导致数据截断的变量来实现精度的提高远远不如采用一个更精确的积分算法,而且c语言提供了自然数e为底的指数函数~而且貌似您的积分算法是不准确的,梯形积分的定义并非如此,其再两端的函数值应该只取1/2.希望您多加细心~
如果不介意的话,就是你的precision应该改为step~这样会能更加准备的表达了这个变量的作用,在你的程序中precision变量其实是积分步长~在数值计算方法中积分精度的控制往往不是通过细化步长来表达,而是通过后一个积分值-前一个积分值<precision 这样来实现精度控制~呵呵追问
我想问下那个以e为底的函数是什么来着,要include吧
追答嗯,是的,需要include,函数原型为:double exp(double x)
参考技术A 1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(11): warning C4305: “初始化”: 从“double”到“float”截断1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(39): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(43): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(47): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
把所有的float改成double试一下!追问
不行啊,就算第一个函数,下限1.0,上限10.0,结果为0.000000
追答请输入类型(1~5):
1
输入积分上限:
10
输入积分下限:
1
定积分值为:58.500002
我在Linux上测试的结果
#include
#include
#include
#define g 9.81
#define e 2.71828182845904523536028747135266249775724709369995
#define F double
#define SCS scanf
#define PR printf
#define D "%d\n"
#define PF "%lf\n"
#define D2 D D
void swap( int * , int * );
F f1( F );
F f2( F );
F f3( F );
F f4( F );
F f5( F );
F integral( F , F , F(*pt)( F ) , F );
void swap(int *ph1,int *ph2)
int temp;
temp=*ph1;
*ph1=*ph2;
*ph2=temp;
void main( void )
int type;
F u_limit,l_limit,precision=0.0000001,(*p_pt)(F);
PR("请输入类型(1~5):\n");
SCS("%d",&type);
switch(type)
case 1: p_pt=f1;break;
case 2: p_pt=f2;break;
case 3: p_pt=f3;break;
case 4: p_pt=f4;break;
case 5: p_pt=f5;break;
default:PR("ERROR!");
PR("输入积分上限:\n");
SCS("%lf",&u_limit);
PR("输入积分下限:\n");
SCS("%lf",&l_limit);
PR("定积分值为:%lf\n",integral(u_limit,l_limit,p_pt,precision));
F f1(F x1)
return(1+x1);
F f2(F x2)
return(2*x2+3);
F f3(F x3)
return(pow(e,x3)+1);
F f4(F x4)
return(pow((1+x4),2));
F f5(F x5)
return(pow(x5,3));
F integral(F ul,F ll,F (*pt)(F x),F pc)
F sum=0;
int counter;
//for(counter=0;counter*pc+ll-0.0000001;counter++)
sum+=pc*(*pt)(ll+counter*pc);
return(sum);
你复制这些代码,自己试一下
积分我早忘光了,我只检查代码的有效性,希望对你有帮助
原型:extern float pow(float x, float y)
接收的是float的值,你那e……能用float表示么……
数学笔记13——定积分
定积分是积分的一种,是函数f(x)在区间[a,b]上的积分和的极限。这里应注意定积分与不定积分之间的关系:若定积分存在,则它是一个具体的数值(曲边梯形的面积),而不定积分是一个函数表达式,它们仅仅在数学上有一个计算关系(牛顿-莱布尼茨公式),其它一点关系都没有!一个函数,可以存在不定积分,而不存在定积分,也可以存在定积分,而不存在不定积分。一个连续函数,一定存在定积分和不定积分;若只有有限个间断点,则定积分存在;若有跳跃间断点,则原函数一定不存在,即不定积分一定不存在。
什么是定积分
有一块形状不规则的土地,要测量它的面积,怎么办呢?
这意味着我们要求解曲线下的面积,该面积从a开始,到b结束,用 表示,这就是定积分。对比不定积分,发现定积分有起点和终点。不定积分是已知导数求原函数,定积分就是求函数f(X)在区间[a,b]中的图像包围的面积。即由 y=0,x=a,x=b,y=f(X)所围成图形的面积。
黎曼和
如何求解曲线下的面积呢?为了简化问题,我们假设f(x) = x2,这是一个较为简单的曲线,同时设a = 0, b = 1:
分为三步计算面积:
- 首先把阴影部分却成一系列等宽的矩形;
- 把这些矩形的面积加起来:
- 修正之前的算法。
如下图所示:
将面积分为成一系列矩形
我们看到,每个矩形都可能超出或小于实际面积,所谓“修正之前的算法”,是修正矩形增加或减少的面积,具体做法是通过让矩形变窄来取得极限值,如下图所示:
矩形变窄
变得更窄的矩形
矩形越窄,就越接近实际面积。
当矩形宽度很小时,把所有矩型面积加起来就是这块不规则图形的面积,这就是著名的“黎曼和”。矩形宽度趋于0时,即为面积微分;各个面积求和取极限即为定积分。虽然牛顿时代就给出了定积分的定义,但是定积分的现代数学定义却是用黎曼和的极限给出。
就上图而言,f(x) = x2,a = 0,把ab分为n份:
曲线下的面积之和就是当n→∞时的矩形面积之和。现在的问题是如何求得(12+22+32+...+n2)/n3。
这需要一点技巧,用作图法求解。
想象一下金字塔,每一层都是有若干块砖头堆砌而成,其模型如下:
垂直切割面如下面两图所示:
图1 三角形面积大于金字塔面积
图2 三角形面积小于金字塔面积
由此可以将问题转换为求金字塔的体积。
面积的示例
三角形的面积
f(x) = x,求阴影部分三角形面积。
长方形的面积
f(x) = 1,求阴影部分长方形的面积。
定积分的公式
结合上面的例子,设Δx = (b - a)/n,给出定积分公式:
可以得到下面的表格:
可以大胆地猜测,
示例
估算f(x) = x3在[-1, 3]上的定积分。
设Δx = 1,
总结
- 定积分就是求函数f(X)在区间[a,b]中的图像包围的面积。
- 当矩形面积很小时,把所有矩型面积加起来就是这块不规则图形的面积,这就是著名的“黎曼和”。
- 定积分公式:
出处:微信公众号 "我是8位的"
本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途!
扫描二维码关注作者公众号“我是8位的”
以上是关于C语言求函数定积分的主要内容,如果未能解决你的问题,请参考以下文章