C語言實現變步長求積分演算法
阿新 • • 發佈:2018-12-16
下面求解如下問題:
1、變步長:
由於多數情況下,並不知道步長設定為多少合適,所以我們可以設定一個初始步長,求解一次,再把步長變為原來的一半,依次接下去,直到達到我們所需的精度。
2、程式碼:
#include<stdio.h> #include<math.h> #define left 1.0 //左端的值 #define right 3.0 //右端的值 #define precision 0.0001 //定義精度 double f(double x) { double m=100/(x*x)*sin(10/x); return m; } int main() { int i; int step=100; //初始化步數 double stepLength=(right-left)/step; //步長 double T=f(left)+f(right); //積分的值 for(i=1;i<=step-1;i++) { double x=left+i*stepLength; T+=2*f(x); } T=stepLength/2*T; //符合梯形公式求解結果 printf("初始步長得到的積分值:%lf 所分的區間個數:%d\n",T,step); //下面改變步長,來細化精度 double T1=T+100; double T2=T; double H; //減小步長後得到的積分值 while(fabs(T1-T2)>precision/2) { T1=T2; step=step*2; stepLength=(right-left)/step; H=0; for(i=1;i<step;i++) { H+=2*f(left+stepLength*i); } H=f(left)+f(right)+H; H=H*stepLength/2; T2=(T1+H)/2; //將上次一的積分結果和減小步長後的積分結果求均值 } printf("初始步長得到的積分值:%lf 所分的區間個數:%d\n",T2,step); }