當前位置:首頁 » 操作系統 » 辛普森演算法

辛普森演算法

發布時間: 2022-08-06 04:52:15

⑴ 梯形法則和辛普森法則求面積的三個不同點

咨詢記錄 · 回答於2021-12-07

⑵ 辛普森法則 是什麼內容

目的:
(1)通過求定積分的程序設計,使學生理解和掌握C++語言的函數、函數指針等設計方法,培養學生綜合利用C++語言解決數學計算問題,使學生將所學知識轉化為分析和設計簡單實際問題的能力,並學會查資料和工具書,進行創新設計。
(2)提高學生建立程序文檔、歸納總結的能力。
(3)進一步鞏固和靈活運用先修課程《計算機文化基礎》有關文字處理、圖表分析、數據歸整、應用軟體之間圖表、數據共享等信息技術處理的綜合能力。
2. 基本要求:
(1)要求用模塊化設計和C++的思想來完成程序的設計;
(2)要求用函數分別編寫梯形法和辛普生法求定積分的程序,分別存到不同的.CPP文件中;
(3)在VC++6.0環境中,學會調試程序的方法,及時查究錯誤,獨立調試完成。
(4)程序調試通過後,完成程序文檔的整理,加必要的注釋。
三、設計方法和基本原理
1. 課題功能描述
本題目的功能是對梯形法和辛普森法,在不同區間數下計算所得的定積分的值,進行精度比較。
2. 問題詳細描述
(1)數值積分
求一個函數f(x)在[a,b]上的定積分∫baf(x) dx,其幾何意義是求f(x)曲線和直線x=a,y=0,x=b所圍成的曲邊梯形面積。為了近似求出此面積,可將[a,b]區間分成若各個小區間,每個區間的寬度為(b-a)/n,n為區間個數。近似求出每個小的曲邊梯形面積,然後將n個小面積加起來,就近似的到總的面積。既定積分的近似值,當n愈大(即區間分的愈小),近似程度愈高。數值積分常用的演算法有:
1)梯形法
用小梯形代替小曲邊梯形,幾何意義如圖所示。
第一個小梯形的面積為:

第i個小梯形的面積為:

其中:
2) 辛普生(Sinpson)法
在小區間范圍內,用一條拋物線代替該區間的f(x)。將(a,b)區間分成2n個小區間,則辛普生法求定積分的公式為:
其中:
(2)要求分別採用梯形法和辛普生法分別計算f1(x)和 f2(x)的定積分。

2、問題的解決方案:
(1) 編寫一個梯形法求定積分的通用函數integralt(),其函數原型為:
double integralt(double a, double b, double(*f)( double));
函數的形參a,b,f分別為定積分的下限、上限和函數名 ,其中f為函數指針。
(2) 編寫一個辛普生法求定積分的通用函數integrals(),其函數原型為:
double integrals(double a, double b, double(*f)( double));
函數的形參a,b,f分別為定積分的下限、上限和函數名 ,其中f為函數指針。
(3) 對所求的被積分表達式分別編寫函數f1和f2:
f1(x)=1+x2
f2(x)=1+x+x2+x3
(4) 在主函數中輸入a,b(0,1)的值,先調用梯形法求積分的integralt()函數,分別計算f1和f2的定積分,並輸出計算結果。再輸入a,b(0,1)的值,調用辛普生法求積分的integrals()函數,分別計算f1和f2的定積分,並輸出計算結果。再次輸入a,b(0,2)的值,再分別調用梯形法和辛普生法分別計算f1和f2的定積分,並輸出計算結果。
(5) 要求在n相同的情況下,對同一個被積函數同區間採用梯形法和辛普生法的積分結果的精度進行分析,主要觀察隨著n值的增加,積分結果的有效數字位數有何變化,兩種方法與精確值的誤差。
要求n值,分別取2,10,100,1000,5000,20000,50000進行觀察。
四、主要技術問題的描述:
1、函數指針
一個函數在編譯時被分配一個入口地址,可以將該地址賦給一個指針變數,這樣,這個指針變數持有函數的入口地址,它就指向了該函數,稱這種指針為指向函數的指針,簡稱函數指針。
2、函數指針定義的一般形式:
數據類型 (*指針變數)(形式參數);
例:int (*pf)(int a,int b);
3、調用的形式舉例:
double integral (double a,double b,int n,double(*f)(double ))
{

ff1=(*f)(a);

ff2=(*f)(x);


}
double f1(double x)
{
double y1;
y1=1+x*x;
return y1;
}
void main ()
{ 。。。
cin>>a>>b>>n;
intesum1=integral(a,b,n,f1);

⑶ C語言小菜鳥求大神編程辛普森法和隨機擲點法

一般有兩種演算法:
演算法一產生12個(0,1)平均分布的隨機函數,用大數定理可以模擬出正態分布。
演算法二用到了數學中的雅可比變換,直接生成正態分布,但此演算法在計算很大規模的數時
會出現溢出錯誤。
測試程序:
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
double _random(void)
{
int a;
double r;
a=rand()%32767;
r=(a+0.00)/32767.00;
return r;
}
double _sta(double mu,double sigma)
{
int i;
double r,sum=0.0;
if(sigma<=0.0) { printf("Sigma<=0.0 in _sta!"); exit(1); }
for(i=1;i<=12;i++)
sum = sum + _random();
r=(sum-6.00)*sigma+mu;
return r;
}
double _sta2(double mu,double sigma)
{
double r1,r2;
r1=_random();
r2=_random();
return sqrt(-2*log(r1))*cos(2*M_PI*r2)*sigma+mu ;
}
int main()
{
int i;
double mu,sigma;
srand( (unsigned)time( NULL ) );
mu=0.0;
sigma=1.0;
printf("Algorithm 1:
");
for(i=0;i<10;i++)
printf("%lf ",_sta(mu,sigma));
printf("Algorithm 2:
");
for(i=0;i<10;i++)
printf("%lf ",_sta2(mu,sigma));
return 0;
}
//由均勻分布的隨機數得到正態分布的隨機數
#include <math.h>
float gasdev(im)
int *im;
{
static int iset=0;
static float gset;
float fac,r,v1,v2;
float ran1();//產生均勻分布的隨機數,可利用系統函數改寫
if (iset == 0) {
do {
v1=2.0*ran1(im)-1.0;
v2=2.0*ran1(im)-1.0;
r=v1*v1+v2*v2;
} while (r >= 1.0);
fac=sqrt(-2.0*log(r)/r);
gset=v1*fac;
iset=1;
return v2*fac;
} else {
iset=0;
return gset;
}
}
原理可找本數值演算法方面的書看看。

⑷ 復合辛普森公式求積分

代碼如下,但是似乎你的題目有問題:
根號X乘lnX 0到1,根號0乘ln0等於0,根號1乘ln1等於1,怎麼求?
#include
#include
#include
double fsimpf(double x) /*要進行計算的被積函數*/
{
\x05double y;
y=log(x)*sqrt(x);
return(y);
}
double fsimp(double a,double b,double eps,int n) /*辛普森演算法:a為積分下限,b為積分上限,eps是希望達到的精度*/
{
int k;
double h,t1,t2,s1,s2,ep,p,x;
h=(float)(b-a)/n;
t1=h*(fsimpf(a)+fsimpf(b))/2.0; /*用梯形公式求出一個大概的估值*/
s1=t1;
ep=eps+1.0;
while (ep>=eps)
\x05{
\x05\x05/*用梯形法則計算*/
\x05\x05p=0.0;
\x05\x05for (k=0;k

⑸ 分別用n=8,16,32的復合梯形和復合辛普森公式計算 根號X乘lnX 0到1的積分

代碼如下,但是似乎你的題目有問題:
根號X乘lnX 0到1,根號0乘ln0等於0,根號1乘ln1等於1,怎麼求?

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

double fsimpf(double x) /*要進行計算的被積函數*/
{
double y;
y=log(x)*sqrt(x);
return(y);
}

double fsimp(double a,double b,double eps,int n) /*辛普森演算法: a為積分下限,b為積分上限,eps是希望達到的精度*/
{
int k;
double h,t1,t2,s1,s2,ep,p,x;
h=(float)(b-a)/n;
t1=h*(fsimpf(a)+fsimpf(b))/2.0; /*用梯形公式求出一個大概的估值*/
s1=t1;
ep=eps+1.0;
while (ep>=eps)
{
/*用梯形法則計算*/
p=0.0;
for (k=0;k<=n-1;k++)
{
x=a+(k+0.5)*h;
p=p+fsimpf(x);
}
t2=(t1+h*p)/2.0;
/*用辛普森公式求精*/
s2=(4.0*t2-t1)/3.0;
ep=fabs(s2-s1);
t1=t2; s1=s2; n=n+n; h=h/2.0;
}
return(s2);
}

void main()
{
double a,b,eps,t;
a=0.0; b=1.0; eps=0.0000001;

printf("**********************************************************\n");
printf("* This program is to calculat the Value of *\n");
printf("* a definite integral by Simpson Method. *\n");
printf("**********************************************************\n");

printf("\n----------------------------------------------------------\n");
printf(" >> The result of definite integral is (n=8): \n");
printf(" >> SIGMA(0,1)sqrt(x)*ln(x)dx = ");
t=fsimp(a,b,eps,8);
printf("%e\n",t);
printf("----------------------------------------------------------\n");

printf("\n----------------------------------------------------------\n");
printf(" >> The result of definite integral is (n=16): \n");
printf(" >> SIGMA(0,1)sqrt(x)*ln(x)dx = ");
t=fsimp(a,b,eps,16);
printf("%e\n",t);
printf("----------------------------------------------------------\n");

printf("\n----------------------------------------------------------\n");
printf(" >> The result of definite integral is (n=32): \n");
printf(" >> SIGMA(0,1)sqrt(x)*ln(x)dx = ");
t=fsimp(a,b,eps,32);
printf("%e\n",t);
printf("----------------------------------------------------------\n");

system("pause");
}

⑹ 1/3辛普森法

這是等距節點積分的近似演算法.

原理如下:


⑺ 請問復合梯形方法、復合simpson方法及Guass數值積分方法演算法的優、缺點和效率哪個更好

復合辛普森要比復合梯形公式更加好一些,這個可以從誤差限的大小來判斷,復合梯形公式的誤差限的系數為-(b-a)/12,而且後面是h平方級還有f的二次導數,而辛普森的系數是-(b-a)/(180*16),後面h是四次方級的,f的導數為四次導數,顯然辛普森的誤差限更加小
而高斯求積公式是對代數精度的方面有著更加好的結果

⑻ C語言實慣用梯形法或辛普森法求解定積分的值

//梯形法求定積分
#include<stdio.h>
#include<math.h>
//定義被積函數
double func(double x){
return sin(x)*cos(x);
}

void main(){
double a,b,h,x,sum;
int i,n;
printf("Input a b and n: ");
scanf("%lf%lf%d",&a,&b,&n);
h=(b-a)/n;
x=a;
sum=(func(a)+func(b))/2;
for(i=1; i<n; i++){
x += h;
sum += func(x);
}
sum *= h;
printf("sum=%.4lf\n",sum);
}

⑼ 辛普森求積公式

直接參考《數學分析》定積分的近似計算以及定積分的應用部分。(大多數的分析教材上都有辛普森公式),而且橢球的體積直接用積分的方法就能做出精確值,哪還用得著用辛普森公式去求一個近似值,辛普森公式本身就是一個數值積分公式,只有在計算一些多項式函數(三次或三次以下)的定積分時才會得出精確值。說得更一般一點,只要被積函數的四階導數(前提是被積函數四階連續可微)在積分區間內不恆等於0,用辛普森公式都有可能產生誤差。
你說的演算法是錯的,但是橢球列出的被積函數確實是一個二次多項式,故可以用辛普森公式算出精確值,V=πbc[1-(0*0)/(a的平方)]*{[a-(-a)]/6},你的演算法的錯誤在於少乘了積分區間的長度,在這個實際問題中它對應著幾何題的高(2a或2b或2c).

熱點內容
優盤的存儲原理 發布:2025-01-16 21:54:27 瀏覽:40
編程好軟體 發布:2025-01-16 20:38:07 瀏覽:423
流量密碼如何改成 發布:2025-01-16 20:37:13 瀏覽:50
java判斷是否是對象 發布:2025-01-16 20:31:04 瀏覽:885
python調用外部程序 發布:2025-01-16 20:14:09 瀏覽:397
緩解壓力英語作文 發布:2025-01-16 20:13:31 瀏覽:65
javaname 發布:2025-01-16 20:13:15 瀏覽:22
用戶訪問表空間 發布:2025-01-16 20:07:07 瀏覽:944
java代碼自動編譯 發布:2025-01-16 19:58:14 瀏覽:314
編程很困難 發布:2025-01-16 19:58:09 瀏覽:674