Выбрать главу

Кстати, фрактальные алгоритмы - неотъемлемая часть современных методов рисования ландшафтов, таких как горы, деревья, облака и пр, эти объекты действительно имеют фрактальную природу.

В youtube можно найти интересные трехмерные визуализации фракталов, например, набрав в поиске “mandelbrot 3d”:

Для желающих поэкспериментировать самостоятельно, исходные коды программы генерации фракталов, приведены в приложении к книге. В приложении также есть готовые изображения фракталов, сгенерированные с высоким разрешением более 10000х10000 пикселов.

23. Горн Гавриила

В математике есть некоторые парадоксы, связанные с бесконечностью.

Так называемый “Горн Гавриила” (Gabriel's Horn) - это фигура, образованная функцией y = 1/x, если создать из нее 3х-мерную фигуру:

Интерес данного объекта в том, что “горн” имеет конечный объем - но при этом бесконечную площадь поверхности. Если бы такая фигура существовала в реальности, ее можно было бы заполнить краской, а вот покрасить целиком не получилось бы.

Действительно, формулы площади (V) и объема (A) “горна” легко найти в Википедии:

Из них видно, что при a = ∞, V становится равным ℼ, а A действительно стремится к бесконечности.

24. Построение графиков функций

Очень многие закономерности гораздо легче исследовать графически. Очень просто и эффективно строить графики с помощью языка Python и библиотеки matplotlib.

Выведем графики функций y = x2 и у = 0.5x2.

import matplotlib.pyplot as plt

plt.title('Graph')

plt.xlabel('X')

plt.ylabel('Y')

x_values = range(0,10)

y_values1 = map(lambda x: 0.5*x*x, x_values)

y_values2 = map(lambda x: x*x, x_values)

plt.axis([0, 10, 0, 20]) # xmin, xmax, ymin, ymax

plt.plot(x_values, y_values1, 'ro', label='0.5*x*x')

plt.plot(x_values, y_values2, marker='o', linestyle='--', label='x*x')

plt.legend()

plt.show()

Результат работы программы выглядит так:

Как можно видеть, мы имеем массив входных данных x_values = range(0,20), и 2 массива выходных данных y_values1 и y_values2, вычисляемых по соответствующим формулам. Все остальное за нас делает библиотека matplotlib. Команда plt.plot выводит график на экран, причем можно задать разные варианты оформления. Команда выводит подсказку (“легенду”), и является опциональной. Команды plt.title, plt.xlabel и plt.ylabel задают названия графика и осей. Команда plt.show выводит окно с графиком на экран.

Рассмотрим более сложный пример.

Выведем график так называемой “функции распределения простых чисел”, показывающий количество простых чисел меньше либо равных числу x.

Программа вывода графика выглядит так:

import matplotlib.pyplot as plt

import math

def is_prime(n):

if n % 2 == 0 and n > 2:

return False

for i in xrange(3, int(math.sqrt(n)) + 1, 2):

if n % i == 0:

return False

return True

def get_primes(n):

cnt = 0

for i in xrange(1, n):

if is_prime(i):

cnt += 1

return cnt

N = 400

x_values = range(2, N)

y_values = map(lambda n: get_primes(n), x_values)

plt.axis([0, N, 0, N/4])

plt.plot(x_values, y_values, 'ro', markersize=1)

plt.show()

Кстати, согласно Википедии, еще в 18м веке Гауссом и Лежандром было высказано предположение что функция распределения простых чисел выглядит так:

Это легко проверить графически, добавив строчку вывода второго графика:

plt.plot(x_values,map(lambda n:n/math.log(n),x_values), marker='o', linestyle='--')

Окончательный график выглядит так:

С помощью библиотеки numpy строить графики еще проще.

График функции sin(t) в диапазоне 0..2𝜋:

import matplotlib.pyplot as plt

import numpy as np

t = np.arange(0.0, 2.0, 0.01)

s = np.sin(2*np.pi*t)

plt.plot(t, s)

plt.show()

Важно заметить, что t здесь - не одно число, а целый массив - в данном примере используется возможность numpy работать непосредственно с массивами.

И наконец, с помощью matplotlib можно строить даже 3х-мерные графики функции двух переменных, для этого используется модуль mplot3d:

from mpl_toolkits.mplot3d import axes3d

import matplotlib.pyplot as plt

import math

fig = plt.figure()

ax = fig.gca(projection='3d')

# Axis

ax.set_xlabel('X')