众所周知二重积分可以用分割成小块块的方法计算,这里就是直接用这个
#include <stdio.h>
#include <math.h>
#define pi 3.141592658
long double func(long double x,long double y)
{
long double z;
z = (x+y)-x*x-y*y; //方程,可以随便修改
/*******************
DLC 绝对值型,如果需要绝对值就用下面的
if(z < 0)
{
z = -z;
}
********************/
return z;
}
int main()
{
unsigned long long N = 0; //强烈建议把N取小一点 , 十亿实在算的太慢了
unsigned long long i,j;
long double x,y;
unsigned long long n = 0;
long double V = 0;
/*******************************
如果是矩形邻域,对N取个值,把x,y区间输进去a,b,c,d即可
long double V;
long double a , b , c , d;
scanf("%Lf %Lf %Lf %Lf" , &a , &b , &c , &d);
for (j = 0 ; j <= N ; j++)
{
for (i = 0 ; i <= N ; i++)
{
V += ((b - a) * (d - c) / (N * N)) * function((a + ((b - a) / N) * i) , (c + ((d - c) / N) * j));
}
}
printf("%lf\n" , V);
return 0;
********************************/
printf("请给出N分块的数量,将把x-y平面拆分成N×N个小块\n"); //下面给出非规则区域
scanf("%ull",&N);
for(i = 0;i < N;i++)
{
for(j = 0;j < N;j++)
{
x = (2.0/((long double)N))*i-1.0;
y = (2.0/((long double)N))*j-1.0;
if(x*x+y*y <= 1) //满足区域条件,这里是圆
{
n++; //计算出分块数
}
}
}
for(i = 0;i<N;i++)
{
for(j = 0;j<N;j++)
{
x = (2.0/((long double)N))*i-1.0; //这是x分割坐标
y = (2.0/((long double)N))*j-1.0; //这是y分割坐标
if(x*x+y*y <= 1) //满足区域条件
{
V += (pi/n)*func(x,y); //V+= S/分块个数(必须满足在区域内)*z;
}
}
}
printf("%lf\n" , V);
}
建议不要给N太大,会爆炸