网上找到的高斯勒让德求积公式一般都是最高4个插值点,正好这次做项目需要高一点的精度就写了这个程序。最高可以到8个插值点,并且插值点个数可以选择。
刚开始学习写程序,感觉这个" if "写的有点啰嗦但是自己也不知道怎么改,就先将就看吧。
//==========================
//*Gauss-Legendre求积公式
//==========================
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include<string>
#include<iomanip>
using namespace std;
int i; //计数点
int n; //插值点个数
double a, b; //积分上下限
long double x, t; //自变量
long double jfz, sum; //
long double x1, x2, x3, x4, x5, x6, x7, x8, x9; //插值点
long double A1, A2, A3, A4, A5, A6, A7, A8, A9; // 求积系数
const long double e = 2.718281828459; //常数e
const long double pi = 3.1415926535898;
void main()
{
cout << "请输入积分下限" << endl;
cin >> a;
cout << endl;
cout << "请输入积分上限" << endl;
cin >> b;
cout << endl;
cout << "请输入插值点个数" << endl;
cin >> n;
if (n == 1)
{
x1 = 0;
x2 = 0;
x3 = 0;
x4 = 0;
x5 = 0;
x6 = 0;
x7 = 0;
x8 = 0;
A1 = 2;
A2 = 0;
A3 = 0;
A4 = 0;
A5 = 0;
A6 = 0;
A7 = 0;
A8 = 0;
}
if (n == 2)
{
x1 = -0.5773502692;
x2 = +0.5773502692;
x3 = 0;
x4 = 0;
x5 = 0;
x6 = 0;
x7 = 0;
x8 = 0;
A1 = 1;
A2 = 1;
A3 = 0;
A4 = 0;
A5 = 0;
A6 = 0;
A7 = 0;
A8 = 0;
}
if (n == 3)
{
x1 = -0.7745966692;
x2 = 0;
x3 = +0.7745966692;
x4 = 0;
x5 = 0;
x6 = 0;
x7 = 0;
x8 = 0;
A1 = 0.5555555556;
A2 = 0.8888888889;
A3 = 0.5555555556;
A4 = 0;
A5 = 0;
A6 = 0;
A7 = 0;
A8 = 0;
}
if (n == 4)
{
x1 = -0.8611363116;
x2 = -0.3399810436;
x3 = +0.3399810436;
x4 = +0.8611363116;
x5 = 0;
x6 = 0;
x7 = 0;
x8 = 0;
A1 = 0.3478548451;
A2 = 0.6521451549;
A3 = 0.6521451549;
A4 = 0.3478548451;
A5 = 0;
A6 = 0;
A7 = 0;
A8 = 0;
}
if (n == 5)
{
x1 = -0.9061798459;
x2 = -0.5384693101;
x3 = 0;
x4 = +0.5384693101;
x5 = +0.9061798459;
x6 = 0;
x7 = 0;
x8 = 0;
A1 = 0.2369268851;
A2 = 0.4786286705;
A3 = 0.5688888889;
A4 = 0.4786286705;
A5 = 0.2369268851;
A6 = 0;
A7 = 0;
A8 = 0;
}
if (n == 6)
{
x1 = -0.9324695142;
x2 = -0.6612093865;
x3 = -0.2386191861;
x4 = +0.2386191861;
x5 = +0.6612093865;
x6 = +0.9324695142;
x7 = 0;
x8 = 0;
A1 = 0.1713244924;
A2 = 0.3607615730;
A3 = 0.4679139346;
A4 = 0.4679139346;
A5 = 0.3607615730;
A6 = 0.1713244924;
A7 = 0;
A8 = 0;
}
if (n == 7)
{
x1 = -0.9491079123;
x2 = -0.7415311856;
x3 = -0.4058451514;
x4 = 0;
x5 = +0.4058451514;
x6 = +0.7415311856;
x7 = +0.9491079123;
x8 = 0;
A1 = 0.1294849662;
A2 = 0.2797053915;
A3 = 0.3818300505;
A4 = 0.4179591837;
A5 = 0.3818300505;
A6 = 0.2797053915;
A7 = 0.1294849662;
A8 = 0;
}
if (n == 8)
{
x1 = -0.9602898565;
x2 = -0.7966664774;
x3 = -0.5255324099;
x4 = -0.1834346425;
x5 = +0.1834346425;
x6 = +0.5255324099;
x7 = +0.7966664774;
x8 = +0.9602898565;
A1 = 0.1012285363;
A2 = 0.2223810345;
A3 = 0.3137066459;
A4 = 0.3626837834;
A5 = 0.3626837834;
A6 = 0.3137066459;
A7 = 0.2223810345;
A8 = 0.1012285363;
}
long double X[9];
X[0] = x1, X[1] = x1, X[2] = x2, X[3] = x3, X[4] = x4, X[5] = x5, X[6] = x6, X[7] = x7, X[8] = x8;
long double A[9];
A[0] = 0, A[1] = A1, A[2] = A2, A[3] = A3, A[4] = A4, A[5] = A5, A[6] = A6, A[7] = A7, A[8] = A8;
long double sum[9];
double func1;
for (i = 0; i < 9; i++)
{
x = X[i];
t = (a + b) / 2 + x * (b - a) / 2; //转换积分区间到到【-1,1】上
func1 = exp(-0.001*0.05*0.5*0.03*(sin(t) - sin(0.1)))*cos(t)*cos(t); //在此处输入被积函数
sum[i] = A[i] * func1;
}
jfz = ( sum[1] + sum[2] + sum[3] + sum[4] + sum[5] + sum[6] + sum[7] + sum[8] ) * (b - a) / 2;
cout << fixed << setprecision(10) << endl;
cout << "该积分的积分值为:" << " " << jfz << endl;
system("pause");
}