Автоматизация функций выше, поэтому мне не нужно каждый раз писать дополнительный термин - PullRequest
2 голосов
/ 25 апреля 2020

Мне было интересно, как я могу автоматизировать этот код:

import numpy as np
import matplotlib.pyplot as plt


f = lambda x: x**2 / np.pi**2 * np.sin(x)

a = 2*np.pi
b = 0


midpoint = lambda n: (a/n) * (f(a/(2*n)) + f(a/(2*n)+(a/n)) + f(a/(2*n)+(2*a/n)))

print(midpoint(3))

midpoint = lambda n: (a/n) * (f(a/(2*n)) + f(a/(2*n)+(a/n)) + f(a/(2*n)+(2*a/n)) + f(a/(2*n)+(3*a/n)))

print(midpoint(4))

midpoint = lambda n: (a/n) * (f(a/(2*n)) + f(a/(2*n)+(a/n)) + f(a/(2*n)+(2*a/n)) + f(a/(2*n)+(3*a/n)) + f(a/(2*n)+(4*a/n)))

print(midpoint(5))

midpoint = lambda n: (a/n) * (f(a/(2*n)) + f(a/(2*n)+(a/n)) + f(a/(2*n)+(2*a/n)) + f(a/(2*n)+(3*a/n)) + f(a/(2*n)+(4*a/n)) + f(a/(2*n)+(5*a/n)))

print(midpoint(6))

midpoint = lambda n: (a/n) * (f(a/(2*n)) + f(a/(2*n)+(a/n)) + f(a/(2*n)+(2*a/n)) + f(a/(2*n)+(3*a/n)) + f(a/(2*n)+(4*a/n)) + f(a/(2*n)+(5*a/n)) + f(a/(2*n)+(6*a/n)))

print(midpoint(7))

Количество членов в каждой средней точке соответствует значению внутри оператора печати

Например, первая средняя точка функция имеет 3 члена, следовательно, оценивается в 3. Вторая функция средней точки имеет 4 члена, следовательно, оценивается в 4. Мне нужно это значение от go до 20, без добавления дополнительного члена каждый раз.

Если все все сделано правильно, числа должны становиться все ближе и ближе к числу "-4"

для всех, кто интересуется, это интеграция средней точки

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Как насчет:

import numpy as np
import matplotlib.pyplot as plt

def midpoint(f, a, n):
    sum = 0
    for i in range(n):
        sum += f(a/(2*n)+(i*a/n))
    return (a/n) * sum

# Constants
F = lambda x: x**2 / np.pi**2 * np.sin(x)
A = 2*np.pi
B = 0

# Print some examples
for n in range(3, 8):
    print(midpoint(F, A, n))

1 голос
/ 25 апреля 2020

Код:

for k in range(3, 20):
    midpoint = lambda n: (a/n) * sum(f(a/(2*n) + (i*a/n)) for i in range(k))
    print(midpoint(k))

Объяснение:

Очевидно, что число слагаемых просто увеличивается. Несколько сложнее добавить дополнительные условия. Этот бит:

sum(f(a/(2*n) + (i*a/n)) for i in range(k))

Используется тот факт, что добавляемые термины следуют предсказуемому шаблону:

term 0 = f(a/(2*n))         = f(a/(2*n) + 0*a/n)
term 1 = f(a/(2*n) + a/n)   = f(a/(2*n) + 1*a/n)
term 2 = f(a/(2*n) + 2*a/n) = f(a/(2*n) + 2*a/n)

et c.

Все, что меняется, - это коэффициент во второй половине суммы, передаваемой в f, поэтому легко свернуть сумму в al oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...