понеділок, 10 вересня 2007 р.

Ruby у математиці - частина друга (обчислення потрійного інтегралу)

Почнемо далі розбиратися з математичними алгоритмами і власне з чисельними методами вивчаючи по ходу мову програмування Ruby.

Обчислення потрійного інтегралу

Для написання програми обчислення потрійного інтегралу ми візьмемо за основу кодя який ми вже використовували для розрахунку подвійного інтегралу. У даному випадку нам потрібно буде додати ще одну координату. У даному випадку нам потрібно розбити об'єм обмежений поверхнями z1(x,y) та z2(x,y) зверху і знизу, а проекція цього об'єму на площину xy обмежується a≤x≤b та y1(x)≤y≤y2(x), де y1, y2 - неперервні функції на [a;b], на якомога менші кубики. Знайшовши значення функції f(x,y,z) і центрі кожного кубику і помноживши на його об'єм, а також просумівавши всі отримані значення ми й отримаємо значення потрійного інтегралу.

Тоді код програми матиме наступний вигляд:

# Обчислення потрійного інтегралу
include Math

puts "Обчислення потрійного інтегралу"
print "Введіть a="; a = gets.to_f
print "Введіть b="; b = gets.to_f
print "Введіть функцію y1(x): y="; y1 = gets.to_s
print "Введіть функцію y2(x): y="; y2 = gets.to_s
print "Введіть функцію поверхні z1(x,y): z="; z1 = gets.to_s
print "Введіть функцію поверхні z2(x,y): z="; z2 = gets.to_s
print "Введіть інтегральну функцію f(x,y,z)="; f = gets.to_s
print "Задайте крок step="; step = gets.to_f

i=a
sum,ty1,ty2,tz1,tz2,j,k,x,y,z=0

while i<=b do
x=i
ty1=eval(y1) ; ty2=eval(y2)
j=ty1
while j<=ty2 do
y=j
tz1=eval(z1) ; tz2=eval(z2)
k=tz1
while k<=tz2 do
x=(i+i+step)/2
y=(j+j+step)/2
z=(k+k+step)/2
sum+=eval(f)*step*step*step
k+=step
end
j+=step
end
i+=step
end

puts "==========================================="
puts "Значення інтегралу: #{sum}"


Спробуємо тепер щось проінтегрувати (вхідні данні візьмемо довільні):

bum@impress:~/Sources/Ruby/Math Problems$ ruby tint.rb
Обчислення потрійного інтегралу
Введіть a=0
Введіть b=1
Введіть функцію y1(x): y=x*x
Введіть функцію y2(x): y=sqrt(x)
Введіть функцію поверхні z1(x,y): z=x*y
Введіть функцію поверхні z2(x,y): z=x*2*y
Введіть інтегральну функцію f(x,y,z)=x*y*z
Задайте крок step=0.005
===========================================
Значення інтегралу: 0.0321406617957358


Отже, щось отримали. Щоб перевірити наскільки правильно ми знайшли значення, спробуємо знайти той же потрійний інтеграл у системі комп'ютерної алгебри Maxima (я користуюся фронтендом wxMaxima). Отже, наш потрійний інтеграл можна розписати наступним чином:

А тепер з допомогою Maxima знаходимо необхідне значення:



Отже, правильне значення даного інтегралу - 1/32=0,03125. Відносна похибка у порівнянні зі значенням отриманим нашою програмою становить 2,8%. Звісно ж задавши менший крок і пожертвувавши швидкістю ми могли б отримати більш точне значення.

Немає коментарів:

Дописати коментар