Gauss-Legendre求积公式-高斯型积分公式

网上找到的高斯勒让德求积公式一般都是最高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");


	
}
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值