74 lines
1.9 KiB
Plaintext
74 lines
1.9 KiB
Plaintext
// Rosetta Code problem: https://rosettacode.org/wiki/Numerical_integration
|
|
// by Jjuanhdez, 06/2022
|
|
|
|
print "function range steps leftrect midrect rightrect trap simpson "
|
|
frmt$ = "%1.10f"
|
|
print "f(x) = x^3 0 - 1 100 ";
|
|
Integrate(0.0, 1.0, 1, 100)
|
|
print "f(x) = 1/x 1 - 100 1000 ";
|
|
Integrate(1.0, 100.0, 2, 1000)
|
|
frmt$ = "%8.3f"
|
|
print "f(x) = x 0 - 5000 5000000 ";
|
|
Integrate(0.0, 5000.0, 3, 5000000)
|
|
print "f(x) = x 0 - 6000 6000000 ";
|
|
Integrate(0.0, 6000.0, 3, 6000000)
|
|
end
|
|
|
|
sub Func(FN, X) //Return F(X) for function number FN
|
|
switch FN
|
|
case 1
|
|
return X ^ 3
|
|
case 2
|
|
return 1.0 / X
|
|
case 3
|
|
return X
|
|
default
|
|
return 0.0
|
|
end switch
|
|
end sub
|
|
|
|
sub Integrate(A, B, FN, N) //Display area under curve for function FN
|
|
// A, B, FN limits A, B, and number of slices N
|
|
|
|
DX = (B-A)/N
|
|
X = A
|
|
Area = 0.0 //rectangular left
|
|
for i = 1 to N
|
|
Area = Area + Func(FN,X)*DX
|
|
X = X + DX
|
|
next i
|
|
print str$(Area, frmt$);
|
|
X = A
|
|
Area = 0.0 //rectangular right
|
|
for i = 1 to N
|
|
X = X + DX
|
|
Area = Area + Func(FN,X)*DX
|
|
next i
|
|
print " ";
|
|
print str$(Area, frmt$);
|
|
X = A + DX / 2.0
|
|
Area = 0.0 //rectangular mid point
|
|
for i = 1 to N
|
|
Area = Area + Func(FN,X)*DX
|
|
X = X + DX
|
|
next i
|
|
print " ";
|
|
print str$(Area, frmt$);
|
|
X = A
|
|
Area = 0.0 //trapezium
|
|
for i = 1 to N
|
|
Area = Area + (Func(FN,X)+Func(FN,X + DX))/2.0*DX
|
|
X = X + DX
|
|
next i
|
|
print " ";
|
|
print str$(Area, frmt$);
|
|
X = A
|
|
Area = 0.0 //Simpson's rule
|
|
for i = 1 to N
|
|
Area = Area + DX/6.0*(Func(FN,X) + 4.0*Func(FN,(X+X + DX)/2.0) + Func(FN,X + DX))
|
|
X = X + DX
|
|
next i
|
|
print " ";
|
|
print str$(Area, frmt$)
|
|
end sub
|