Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Mathplotlib – карти висот

leave a comment »

Я вже раз писав про те, як малювати графіки за допомогою Mathplotlib, і мені це так сподобалось, що вирішив написати ще. Цього разу про графіки функцій від двох змінних.

І хоча ця бібліотека займається тільки двовимірною графікою, але поверхні (особливо функціональні) дуже гарно задаються картою висот. Mathplotlib малює такі карти в гаммі фізичних. Тобто чим глибше тим синіше, чим вище, тим коричневіше.

Щоб намалювати таку функцію в функцію (вибачте за каламбур) imshow() передають двовимірний масив з значеннями. А так як індекси масиву цілі, і починаються з нуля, то після цього варто ще написати extent=[min_x,max_x,min_y,max_y] і задати межі в яких побудований наш графік, щоб на осях були правильні позначки.

Я написав програмку:

# coding=utf-8
import matplotlib.pyplot as plt
from math import *


print "Програма побудови карти висот"

fstring=raw_input("f(x,y)=")#Вводимо текст функції

def f(x,y):
	return eval(fstring) # ну, і відповідно за ним обчислюємо функцію.

print "На області [a,b]x[c,d]"# Вводимо інтервал
a=input("a=")
b=input("b=")
c=input("c=")
d=input("d=")

assert a<b, "a >= b"# Перевіряємо щоб інтервал був правильним
assert c<d, "c >= d"

deltax=(b-a)/1000.0 # Беремо невеликий діаметр розбиття
deltay=(d-c)/1000.0

Y=[] # Координати графіка
y=c
while y<d: 
	x=a
	X=[]
	while x<b:
		X.append(f(x,y))
		x+=deltax
	Y.append(X)
	y+=deltay

plt.rc('text', usetex=True) # Ця опція вказує нам, що треба використати зовнішній парсер LaTeX. Залежності: LaTeX, dvipng, ghostscript
plt.ylabel("$y$") #Підписи
plt.xlabel("$x$")

plt.imshow(Y,extent=[a,b,c,d])

plt.colorbar()

label=raw_input("Заголовок функції (LaTeX, не обов'язково) ") 
plt.title(r"$\displaystyle f(x,y)="+label+"$") # заголовок графіка
plt.grid(True) # сітка
plt.show()     # і нарешті покажемо це користувачу

Ну, і вирішив намалювати цікаву функцію f(x,y)=\sin (x^2+y^2) і на моє здивування отримав таку картинку:

Функція атомної гратки

Вона мені нагадала зображення з іонного мікроскопа:

Зображення атомів в іонному мікроскопі

Зображення атомів в іонному мікроскопі

Але, як виявилось, я не відкрив модель атомної гратки, а просто виявив цікаву помилку. Якщо збільшувати роздільну здатність (зменшувати діаметр розбиття), то графік стає правильним:

Правильний графік

Правильний графік

Правда при таких точностях доводиться обчислювати мільйон значень функції, а Python скриптова мова, тому трохи тормозить. Якщо ваші функції простіші, то зменшіть значення deltax та deltay, а все інше за вас зробить інтерполяція. Але акуратно!

Оце і все. Просто, хіба ні?

Advertisements

Written by bunyk

Листопад 16, 2009 at 12:19

Оприлюднено в Графіка, Кодерство

Tagged with ,

Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: