28.5: Додаткові теми
- Page ID
- 75974
У цьому розділі представлено кілька більш просунутих тем, які дозволяють використовувати комп'ютерне програмування для спрощення багатьох завдань. У цьому розділі ми покажемо вам, як можна написати власну програму для чисельної оцінки значення інтеграла будь-якої функції.
Визначення власних функцій
Хоча Python надає безліч модулів і функцій, часто корисно мати можливість визначити свої власні функції. Наприклад, припустимо, що ви хотіли б визначити функцію, яка обчислює\(\frac{1}{2}x^{2} +\frac{1}{4}x^{3} + \cos(2x)\), для заданого значення\(x\). Це робиться легко за допомогою ключового слова def
в Python:
код пітона\(\PageIndex{1}\)
Визначення функції
#import the math module in order to use cos import math as m #define our function and call it myfunction: def myfunction(x): return x**2 / 3 + x**3 / 4 + m.cos(2*x) #Test our function by printing out the result of evaluating it as x = 3 print ( myfunction(3) )
Вихід
10.710170286650365
Кілька речей, які слід зазначити щодо коду вище:
- Функції визначаються за допомогою ключового слова
def
, за яким слідує ім'я, яке ми вибираємо для функції (у нашому випадкуmyfunction
) - Якщо функції приймають аргументи, вони вказуються в дужках після імені функції (у нашому випадку у нас є один аргумент, який ми вибрали для виклику
x
) - Після імені функції і аргументів ставимо двокрапку
- Код, який належить функції, після двокрапки повинен бути відступом (це дозволяє Python знати, де закінчується код функції)
- Функція може «повернути» значення; це робиться за допомогою ключового слова
return
. - Ми використовували «оператор»
**
, щоб взяти ступінь числа (x**2
), а оператор*
- для множення чисел. Python не зрозуміє щось на кшталт2x
; потрібно використовувати оператор множення, тобто2*x
.
У наведеному вище прикладі ми написали функцію Python для представлення математичної функції. Однак можна написати функцію для виконання будь-якого набору завдань, а не тільки для застосування математичної функції. Функції Python дуже корисні для того, щоб уникнути необхідності багаторазово вводити один і той же код.
Нагадаємо, що модуль numpy
дозволяє застосовувати функції до масивів чисел, а не єдиного числа. Ми можемо трохи змінити код вище, так що, якщо аргумент функції, х
, є масивом, функція буде витончено повертати масив чисел, до якого була застосована функція. Це робиться шляхом простої заміни виклику математичної
версії функції cos
за допомогою numpy
версії:
код пітона\(\PageIndex{2}\)
Визначення функції, яка працює над масивом
#import the numpy module in order to use cos to an array import numpy as np #define our function and call it myfunction: def myfunction(x): return x**2 / 3 +x**3 / 4 + np.cos(2*x) #Test our function by printing out the result and evaluating it at x = 3 (same as before) print( myfunction(3) ) #Test it with an array xvals = np.array([1, 2, 3]) print ( myfunction(xvals) )
Вихід
10.710170286650365 [ 0.1671865 2.67968971 10.71017029]
де ми створили масив xvals
за допомогою модуля numpy
.
Використання циклу для обчислення інтеграла
Можливість визначати власні функції в Python дозволяє нам легко спростити складні завдання. Використання «петель» - це ще один спосіб, яким комп'ютерне програмування може значно спростити обчислення, які в іншому випадку були б дуже стомлюючими. У циклі можна повторити одне і те ж завдання багато разів. У наведеному нижче прикладі просто п'ять разів роздруковується твердження:
Код Python\(\PageIndex{3}\)
Проста петля
#A loop to print out a statement 5 times: for i in range(5): print("The value of i is ", i)
Вихід
The value of i is 0 The value of i is 1 The value of i is 2 The value of i is 3 The value of i is 4
Кілька приміток до коду вище:
- Цикл визначається за допомогою ключових слів
для... in
- Значення після ключового слова
for
є змінною «iterator» і буде мати різне значення кожного разу, коли код всередині циклу виконується (в нашому випадку ми називали зміннуi
) - Значення після ключового слова
in
- це масив значень, які буде приймати ітератор - Функція
range (N)
повертає масив зN
цілих значень між0
іN-1
(у нашому випадку це повертає п'ять значень\(0,1,2,3,4\)) - Коду, який буде виконуватися на кожній «ітерації» циклу, передує двокрапка і відступ (так само, як код функції також слідує за двокрапкою і має відступ)
Тепер у нас є всі інструменти для оцінки інтеграла чисельно. Нагадаємо, що інтеграл функції\(f(x)\) між\(x_{a}\) і\(x_{b}\) є просто сумою:
\[\begin{aligned} \int_{x_{a}}^{x_{b}}f(x)dx &= \lim_{\Delta x \to 0}\sum _{i=0}^{i=N-1}f(x_{i})\Delta x \\ \Delta x&=\frac{x_{b}-x_{a}}{N} \\ x_{i}&=x_{a}+i\Delta x \end{aligned}\]
Межа\(∆x → 0\) еквівалентна ліміту\(N → ∞\). Наша стратегія оцінки інтеграла:
- Визначте функцію Python для\(f(x)\).
- Створити масив,
xvals
,\(N\) значень\(x\) між\(x_{a}\) і\(x_{b}\). - Оцініть функцію для всіх цих значень і збережіть їх у масиві,
fvals
. - Цикл над усіма значеннями в масиві
fvals
, помножте їх на\(∆x\) і підсумуйте їх разом.
Давайте використаємо Python для оцінки інтеграла функції\(f(x) = 4x^{3}+3x^{2}+5\) між\(x = 1\) і\(x = 5\):
Код Python\(\PageIndex{4}\)
Чисельне інтегрування функції
#import numpy to work with arrays: import numpy as np #define our function def f(x): return 4*x**3 + 3*x**2 + 5 #Make N and the range of integration variables: N - 1000 xmin = 1 xmax = 5 #create the array of values of x between xmin and xmax xvals = np.linspace(xmin, xmax, N) #evaluate the function at all those values of x fvals = f(xvals) #calculate delta x deltax = (xmax - xmin) / N #initialize the sum to be zero: sum = 0 #loop over the values fvals and add them to the sum for fi in fvals: sum = sum + fi*deltax #print the result: print("The integral between {} and {} using {} steps is {:.2f}".format(xmin, xmax, N, sum))
Вихід
The integral between 1 and 5 using 1000 steps is 768.42
Можна легко інтегрувати вищевказану функцію аналітично і отримати точний результат\(768\). Числова відповідь наблизиться до точної відповіді, оскільки ми робимо\(N\) більше. Звичайно, сила числового інтегрування полягає в тому, щоб використовувати її, коли функція не може бути інтегрована аналітично.
Вправа\(\PageIndex{1}\)
Яке значення ви\(N\) повинні використовувати вище, щоб отримати в межах\(0.01\) точної аналітичної відповіді?
- Відповідь
-