Write a program to calculate double integral numerically.
例子:
输入:给定以下积分。 在哪里输出: 3.915905
解释和方法:
- 我们需要决定我们将使用什么方法来求解积分。
在本例中,我们将使用 Simpson 1/3 方法进行 x 和 y 积分。
为此,首先,我们需要确定步长。设 h 是关于 x 的积分步长,k 是关于 y 的积分步长。
在这个例子中,我们取 h=0.1 和 k=0.15。
请参阅辛普森 1/3 规则 - 我们需要创建一个表格,其中包含所有 x 和 y 点的所有可能组合的函数f(x, y) 的值。
x\y y0 y1 y2 …. ym x0 f(x0, y0) f(x0, y1) f(x0, y2) …. f(x0, ym) x1 f(x1, y0) f(x1, y1) f(x1, y2) …. f(x1, ym) x2 f(x2, y0) f(x2, y1) f(x2, y2) …. f(x2, ym) x3 f(x3, y0) f(x3, y1) f(x3, y2) …. f(x3, ym) …. …. …. …. …. …. …. …. …. …. …. …. xn f(xn, y0) f(xn, y1) f(xn, y2) …. f(xn, ym) 在给定的问题中,
x0=2.3 x2=2.4 x3=3.5 y0=3.7 y1=3.85 y2=4 y3=4.15 y4=4.3
- 生成表格后,我们在表格的每一行上应用 Simpson 1/3 规则(或问题中要求的任何规则)以找到每个 x 处的积分 wrt y 并将值存储在数组 ax[] 中。
- 我们再次对数组 ax[] 的值应用辛普森 1/3 规则(或任何要求的规则)来计算积分 wrt x。
下面是上面代码的实现:
C++
// C++ program to calculate
// double integral value
#include
using namespace std;
// Change the function according to your need
float givenFunction(float x, float y)
{
return pow(pow(x, 4) + pow(y, 5), 0.5);
}
// Function to find the double integral value
float doubleIntegral(float h, float k,
float lx, float ux,
float ly, float uy)
{
int nx, ny;
// z stores the table
// ax[] stores the integral wrt y
// for all x points considered
float z[50][50], ax[50], answer;
// Calculating the numner of points
// in x and y integral
nx = (ux - lx) / h + 1;
ny = (uy - ly) / k + 1;
// Calculating the values of the table
for (int i = 0; i < nx; ++i) {
for (int j = 0; j < ny; ++j) {
z[i][j] = givenFunction(lx + i * h,
ly + j * k);
}
}
// Calculating the integral value
// wrt y at each point for x
for (int i = 0; i < nx; ++i) {
ax[i] = 0;
for (int j = 0; j < ny; ++j) {
if (j == 0 || j == ny - 1)
ax[i] += z[i][j];
else if (j % 2 == 0)
ax[i] += 2 * z[i][j];
else
ax[i] += 4 * z[i][j];
}
ax[i] *= (k / 3);
}
answer = 0;
// Calculating the final integral value
// using the integral obtained in the above step
for (int i = 0; i < nx; ++i) {
if (i == 0 || i == nx - 1)
answer += ax[i];
else if (i % 2 == 0)
answer += 2 * ax[i];
else
answer += 4 * ax[i];
}
answer *= (h / 3);
return answer;
}
// Driver Code
int main()
{
// lx and ux are upper and lower limit of x integral
// ly and uy are upper and lower limit of y integral
// h is the step size for integration wrt x
// k is the step size for integration wrt y
float h, k, lx, ux, ly, uy;
lx = 2.3, ux = 2.5, ly = 3.7,
uy = 4.3, h = 0.1, k = 0.15;
printf("%f", doubleIntegral(h, k, lx, ux, ly, uy));
return 0;
}
Java
// Java program to calculate
// double integral value
class GFG{
// Change the function according to your need
static float givenFunction(float x, float y)
{
return (float) Math.pow(Math.pow(x, 4) +
Math.pow(y, 5), 0.5);
}
// Function to find the double integral value
static float doubleIntegral(float h, float k,
float lx, float ux,
float ly, float uy)
{
int nx, ny;
// z stores the table
// ax[] stores the integral wrt y
// for all x points considered
float z[][] = new float[50][50], ax[] = new float[50], answer;
// Calculating the numner of points
// in x and y integral
nx = (int) ((ux - lx) / h + 1);
ny = (int) ((uy - ly) / k + 1);
// Calculating the values of the table
for (int i = 0; i < nx; ++i)
{
for (int j = 0; j < ny; ++j)
{
z[i][j] = givenFunction(lx + i * h,
ly + j * k);
}
}
// Calculating the integral value
// wrt y at each point for x
for (int i = 0; i < nx; ++i)
{
ax[i] = 0;
for (int j = 0; j < ny; ++j)
{
if (j == 0 || j == ny - 1)
ax[i] += z[i][j];
else if (j % 2 == 0)
ax[i] += 2 * z[i][j];
else
ax[i] += 4 * z[i][j];
}
ax[i] *= (k / 3);
}
answer = 0;
// Calculating the final integral value
// using the integral obtained in the above step
for (int i = 0; i < nx; ++i)
{
if (i == 0 || i == nx - 1)
answer += ax[i];
else if (i % 2 == 0)
answer += 2 * ax[i];
else
answer += 4 * ax[i];
}
answer *= (h / 3);
return answer;
}
// Driver Code
public static void main(String[] args)
{
// lx and ux are upper and lower limit of x integral
// ly and uy are upper and lower limit of y integral
// h is the step size for integration wrt x
// k is the step size for integration wrt y
float h, k, lx, ux, ly, uy;
lx = (float) 2.3; ux = (float) 2.5; ly = (float) 3.7;
uy = (float) 4.3; h = (float) 0.1; k = (float) 0.15;
System.out.printf("%f", doubleIntegral(h, k, lx, ux, ly, uy));
}
}
/* This code contributed by PrinciRaj1992 */
Python3
# Python3 program to calculate
# double integral value
# Change the function according
# to your need
def givenFunction(x, y):
return pow(pow(x, 4) + pow(y, 5), 0.5)
# Function to find the double integral value
def doubleIntegral(h, k, lx, ux, ly, uy):
# z stores the table
# ax[] stores the integral wrt y
# for all x points considered
z = [[None for i in range(50)]
for j in range(50)]
ax = [None] * 50
# Calculating the numner of points
# in x and y integral
nx = round((ux - lx) / h + 1)
ny = round((uy - ly) / k + 1)
# Calculating the values of the table
for i in range(0, nx):
for j in range(0, ny):
z[i][j] = givenFunction(lx + i * h,
ly + j * k)
# Calculating the integral value
# wrt y at each point for x
for i in range(0, nx):
ax[i] = 0
for j in range(0, ny):
if j == 0 or j == ny - 1:
ax[i] += z[i][j]
elif j % 2 == 0:
ax[i] += 2 * z[i][j]
else:
ax[i] += 4 * z[i][j]
ax[i] *= (k / 3)
answer = 0
# Calculating the final integral
# value using the integral
# obtained in the above step
for i in range(0, nx):
if i == 0 or i == nx - 1:
answer += ax[i]
elif i % 2 == 0:
answer += 2 * ax[i]
else:
answer += 4 * ax[i]
answer *= (h / 3)
return answer
# Driver Code
if __name__ == "__main__":
# lx and ux are upper and lower limit of x integral
# ly and uy are upper and lower limit of y integral
# h is the step size for integration wrt x
# k is the step size for integration wrt y
lx, ux, ly = 2.3, 2.5, 3.7
uy, h, k = 4.3, 0.1, 0.15
print(round(doubleIntegral(h, k, lx, ux, ly, uy), 6))
# This code is contributed
# by Rituraj Jain
C#
// C# program to calculate
// double integral value
using System;
class GFG
{
// Change the function according to your need
static float givenFunction(float x, float y)
{
return (float) Math.Pow(Math.Pow(x, 4) +
Math.Pow(y, 5), 0.5);
}
// Function to find the double integral value
static float doubleIntegral(float h, float k,
float lx, float ux,
float ly, float uy)
{
int nx, ny;
// z stores the table
// ax[] stores the integral wrt y
// for all x points considered
float [, ] z = new float[50, 50];
float [] ax = new float[50];
float answer;
// Calculating the numner of points
// in x and y integral
nx = (int) ((ux - lx) / h + 1);
ny = (int) ((uy - ly) / k + 1);
// Calculating the values of the table
for (int i = 0; i < nx; ++i)
{
for (int j = 0; j < ny; ++j)
{
z[i, j] = givenFunction(lx + i * h,
ly + j * k);
}
}
// Calculating the integral value
// wrt y at each point for x
for (int i = 0; i < nx; ++i)
{
ax[i] = 0;
for (int j = 0; j < ny; ++j)
{
if (j == 0 || j == ny - 1)
ax[i] += z[i, j];
else if (j % 2 == 0)
ax[i] += 2 * z[i, j];
else
ax[i] += 4 * z[i, j];
}
ax[i] *= (k / 3);
}
answer = 0;
// Calculating the final integral value
// using the integral obtained in the above step
for (int i = 0; i < nx; ++i)
{
if (i == 0 || i == nx - 1)
answer += ax[i];
else if (i % 2 == 0)
answer += 2 * ax[i];
else
answer += 4 * ax[i];
}
answer *= (h / 3);
return answer;
}
// Driver Code
public static void Main()
{
// lx and ux are upper and lower limit of x integral
// ly and uy are upper and lower limit of y integral
// h is the step size for integration wrt x
// k is the step size for integration wrt y
float h, k, lx, ux, ly, uy;
lx = (float) 2.3; ux = (float) 2.5; ly = (float) 3.7;
uy = (float) 4.3; h = (float) 0.1; k = (float) 0.15;
Console.WriteLine(doubleIntegral(h, k, lx, ux, ly, uy));
}
}
// This code contributed by ihritik
输出:
3.915905