нахождение определенных интегралов на языке Python с использованием правила трапеции


Я написал эту программу, которая находит определенный интеграл функции. Где в программе я могу оптимизировать этот код:

def trapezium(f,n,a,b):
    h=(b-a)/float(n)

    area = (0.5)*h
    sum_y = (f(0)+f(b))

    i=a
    while i<b:
        print i
        sum_y += 2*f(i)
        i += h

    area *= sum_y


    return area

def f(x):
    return x ** 2



print trapezium(f, 10000, 0, 5)


4083
2
задан 27 августа 2011 в 07:08 Источник Поделиться
Комментарии
2 ответа

Во-первых, есть ошибка, где вы есть:

sum_y = (f(0)+f(b))

ф(0) должно быть F(а). Это не на вашем примере важно, потому что вы начинаете с 0, но иначе.

Другая ошибка заключается в том, что вы добавляете ф(а) 3 раза вместо одного раза. я=а+H должна быть линия до времени.

Ваш цикл while делает О(N) умножений и два раза больше дополнений. Вместо этого вы должны иметь что-то вроде:

i = a+h
part_sum = 0
while i<b:
part_sum += f(i)
i += h
sum_y += 2*part_sum

Все-таки же ряд дополнений, но только одно умножение.

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

печати значительно замедляет свои функции. Если вам действительно нужно, чтобы напечатать это, то хранить промежуточные результаты в массив и затем распечатать их до конечного результата с принтом "\п".соединения(интермедиаты).

6
ответ дан 27 августа 2011 в 09:08 Источник Поделиться

def trapezium(f,n,a,b):

Я рекомендую строкой документации, объясняющие аргументы

    h=(b-a)/float(n)

Я рекомендую добавлять от __будущее__ импортным отделом , так что разделение всегда приводит в поплавок, а затем делать это.

    area = (0.5)*h

Падение (): площадь = 0.5*ч

    sum_y = (f(0)+f(b))

Падение (): sum_y = ф(0) + ф(б)

    i=a
while i<b:
print i
sum_y += 2*f(i)
i += h

Вы должны быть печать здесь? Я предполагаю, что нет. Вы должны использовать цикл for

for i in xrange(a,b,h):
sum_y += 2 * f(i)

А еще лучше генератор выражение:

sum_y += сумма(2*ф(Я) Для я в xrange(а,б,ч))

...

    area *= sum_y

return area

Почему так много пустых строк?

def f(x):
return x ** 2

print trapezium(f, 10000, 0, 5)

Если вы заинтересованы в получении более высокой скорости, вы должны посмотреть и NumPy.

1
ответ дан 27 августа 2011 в 02:08 Источник Поделиться