ローレンツ・アトラクタ

気晴らしにProcessingでローレンツ・アトラクタを書いてみました。
ローレンツ方程式は以下のとおりです。

chart
chart2
chart3

これを解いて dx, dy, dz を求めます。

chart_2
chart2_2
chart3_2

これをProcessingで描画します。

float x = 0.01;
float y = 0.01;
float z = 0.01;

float dx;
float dy;
float dz;
float dt = 0.02;

float p = 10;
float r = 28;
float b = 8/3;

final int POINT_SIZE = 10000;

float [][] pointAry = new float[3][POINT_SIZE];

void setup() {
  size(500, 500, P3D);
  //noStroke();
  colorMode(RGB, 255);
  smooth();
  frameRate(1);
  for(int i=0; i<POINT_SIZE; i++) {
    dx = (- p*x + p*y) * dt;
    dy = (- x*z + r*x - y) * dt;
    dz = (  x*y - b*z) * dt;
    x += dx;
    y += dy;
    z += dz;
    pointAry[0][i] = x*7;
    pointAry[1][i] = y*3;
    pointAry[2][i] = z*5;
  }
}

void draw() {
  translate(width/2, height/2, 30);
  for(int i=0; i<POINT_SIZE; i++) {
    stroke(255, 0, 0, 100);
    point(pointAry[0][i], pointAry[1][i], pointAry[2][i]);
  }
  saveFrame();
}

出来上がりはこんな感じです。

lorenz

広告

Gauche-gl

就職試験前なのでSICPはお休みにするつもりでしたが
Schemeを触りたくなったのですこしやってみました
Gauche-glをインストールしてサンプルのgears.scmを実行してみました。

apt-get install gauche-gl
gosh /usr/share/doc/gauche-gl/examples/gears.scm

GL_RENDERER       = Gallium 0.4 on AMD RS880
GL_VERSION        = 2.1 Mesa 8.0.2
GL_VENDOR         = X.Org
GL_EXTENSIONS = GL_ARB_multisample GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_copy_texture GL_EXT_polygon_offset GL_EXT_subtexture GL_EXT_texture_object GL_EXT_vertex_array GL_EXT_compiled_vertex_array GL_EXT_texture GL_EXT_texture3D GL_IBM_rasterpos_clip GL_ARB_point_parameters GL_EXT_draw_range_elements GL_EXT_packed_pixels GL_EXT_point_parameters GL_EXT_rescale_normal GL_EXT_separate_specular_color GL_EXT_texture_edge_clamp GL_SGIS_generate_mipmap GL_SGIS_texture_border_clamp GL_SGIS_texture_edge_clamp GL_SGIS_texture_lod GL_ARB_framebuffer_sRGB GL_ARB_multitexture GL_EXT_framebuffer_sRGB GL_IBM_multimode_draw_arrays GL_IBM_texture_mirrored_repeat GL_ARB_texture_cube_map GL_ARB_texture_env_add GL_ARB_transpose_matrix GL_EXT_blend_func_separate GL_EXT_fog_coord GL_EXT_multi_draw_arrays GL_EXT_secondary_color GL_EXT_texture_env_add GL_EXT_texture_filter_anisotropic GL_EXT_texture_lod_bias GL_INGR_blend_func_separate GL_NV_blend_square GL_NV_light_max_exponent GL_NV_texgen_reflection GL_NV_texture_env_combine4 GL_SUN_multi_draw_arrays GL_ARB_texture_border_clamp GL_ARB_texture_compression GL_EXT_framebuffer_object GL_EXT_texture_env_combine GL_EXT_texture_env_dot3 GL_MESA_window_pos GL_NV_packed_depth_stencil GL_NV_texture_rectangle GL_ARB_depth_texture GL_ARB_occlusion_query GL_ARB_shadow GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar GL_ARB_texture_env_dot3 GL_ARB_texture_mirrored_repeat GL_ARB_window_pos GL_EXT_stencil_two_side GL_EXT_texture_cube_map GL_NV_depth_clamp GL_NV_fog_distance GL_APPLE_packed_pixels GL_APPLE_vertex_array_object GL_ARB_draw_buffers GL_ARB_fragment_program GL_ARB_fragment_shader GL_ARB_shader_objects GL_ARB_vertex_program GL_ARB_vertex_shader GL_ATI_draw_buffers GL_ATI_texture_env_combine3 GL_ATI_texture_float GL_EXT_shadow_funcs GL_EXT_stencil_wrap GL_MESA_pack_invert GL_NV_primitive_restart GL_ARB_depth_clamp GL_ARB_fragment_program_shadow GL_ARB_half_float_pixel GL_ARB_occlusion_query2 GL_ARB_point_sprite GL_ARB_shading_language_100 GL_ARB_sync GL_ARB_texture_non_power_of_two GL_ARB_vertex_buffer_object GL_ATI_blend_equation_separate GL_EXT_blend_equation_separate GL_OES_read_format GL_ARB_color_buffer_float GL_ARB_pixel_buffer_object GL_ARB_texture_compression_rgtc GL_ARB_texture_float GL_ARB_texture_rectangle GL_ATI_texture_compression_3dc GL_EXT_packed_float GL_EXT_pixel_buffer_object GL_EXT_texture_compression_rgtc GL_EXT_texture_mirror_clamp GL_EXT_texture_rectangle GL_EXT_texture_sRGB GL_EXT_texture_shared_exponent GL_ARB_framebuffer_object GL_EXT_framebuffer_blit GL_EXT_framebuffer_multisample GL_EXT_packed_depth_stencil GL_ARB_vertex_array_object GL_ATI_separate_stencil GL_ATI_texture_mirror_once GL_EXT_draw_buffers2 GL_EXT_gpu_program_parameters GL_EXT_texture_array GL_EXT_texture_compression_latc GL_EXT_texture_sRGB_decode GL_EXT_timer_query GL_OES_EGL_image GL_MESA_texture_array GL_ARB_copy_buffer GL_ARB_depth_buffer_float GL_ARB_half_float_vertex GL_ARB_instanced_arrays GL_ARB_map_buffer_range GL_ARB_texture_rg GL_ARB_texture_swizzle GL_ARB_vertex_array_bgra GL_EXT_separate_shader_objects GL_EXT_texture_swizzle GL_EXT_vertex_array_bgra GL_NV_conditional_render GL_AMD_draw_buffers_blend GL_AMD_shader_stencil_export GL_ARB_ES2_compatibility GL_ARB_draw_buffers_blend GL_ARB_draw_elements_base_vertex GL_ARB_explicit_attrib_location GL_ARB_fragment_coord_conventions GL_ARB_provoking_vertex GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_shader_stencil_export GL_ARB_shader_texture_lod GL_ARB_texture_rgb10_a2ui GL_ARB_vertex_type_2_10_10_10_rev GL_EXT_provoking_vertex GL_EXT_texture_snorm GL_MESA_texture_signed_rgba GL_NV_texture_barrier GL_ARB_robustness GL_ARB_texture_storage 

296 in 5.008 seconds = 59.105431309904155 FPS
300 in 5.013 seconds = 59.844404548174744 FPS
300 in 5.011 seconds = 59.86828976252245 FPS
.....

うまく動きました。

Emacs上でGaucheを動かす

先日、SICPを購入したので早速環境を整えました。

1. ホームディレクトリに.emacs.dフォルダを作成。

mkdir .emacs.d

2. .emacs.d に移動

 cd .emacs.d 

3. init.el を Emacs で開く

emacs  init.el

3. 下記のコードを init.el に追加

   (setq scheme-program-name "gosh")
   (require 'cmuscheme)

   (defun scheme-other-window ()
     "Run scheme on other window"
     (interactive)
     (switch-to-buffer-other-window
     (get-buffer-create "*scheme*"))
     (run-scheme scheme-program-name))

   (define-key global-map
     "\C-cS" 'scheme-other-window)

4. init.elを保存し、Emacsを再起動する。

以上で設定完了です!

C-c S     別ウィンドウで gauche インタプリタが起動する。
C-c C-l     Scheme file のロード
C-x C-e     直前のS式を評価
M-C Space     カーソルの次のS式をマーク
M-C-a     カーソルを含むトップレベルのS式の先頭へ移動
M-C-e     カーソルを含むトップレベルのS式の末尾へ移動
M-C-f     次のS式へ移動
M-C-b     前のS式へ移動
M-C-t     カーソルの前後のS式を交換