化学平衡
Model was written in NetLogo 6.4.0
•
Viewed 81 times
•
Downloaded 3 times
•
Run 0 times
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
Comments and Questions
Please start the discussion about this model!
(You'll first need to log in.)
Click to Run Model
; Li Ying created this module at Shaanxi Normal University in 2024. If you mention this model in a publication, we ask that you include the citations below. ;Ying, L. (2024). Chemical Equilibrium. School of Chemistry and Chemical Engineering, Shaanxi Normal University. breed [mode7_no2_t mode7_no2] breed [mode7_n2o4_t mode7_n2o4] breed [mode7_square_t mode7_square] breed [mode7_he_t mode7_he] globals[ float_y old_float_y count_no2 count_no2_new count_n2o4 figure_x figure_one_flag figure_Up_T_flag figure_Down_T_flag figure_add_P_flag figure_delete_P_flag figure_add_V_flag figure_add_in_flag figure_add_cat_flag figure_c_actant_flag figure_c_resultant_flag temp_ticks Q K V SL_1 SL_2 ] to setup clear-all ;设置画布颜色白色 ask patches [ set pcolor white ] ;;初始化海龟 set-default-shape mode7_no2_t "no2" set-default-shape mode7_n2o4_t "n2o4" set-default-shape mode7_square_t "square" set-default-shape mode7_he_t "he" ;;初始化活塞位置 set float_y 0 set old_float_y 0 create_float ;;初始化turtle create-mode7_no2_t 100[ setxy random-xcor random((min-pycor + 2) - (float_y - 2)) + (float_y - 2) set size 2 ] set K 0.885 set V 100 set count_no2 count mode7_no2_t set SL_1 0 set SL_2 0 set figure_one_flag 0 set figure_Up_T_flag 0 set figure_x 0 reset-ticks end to go if ticks mod 5000 = 0[ turtles_action reactivity ] change_float_set set count_no2 count mode7_no2_t set count_n2o4 count mode7_n2o4_t update_figure tick end to update_figure if ticks mod 200 = 0[ if figure_one_flag = 0[ ifelse ticks <= 810000 [ set SL_2 ((sqrt ticks) / 18) set SL_1 (100 - SL_2) ] [set figure_one_flag 1] ] ;;升高温度按键按下 if figure_Up_T_flag = 1[ ifelse figure_x < 2500[ set SL_1 ((sqrt figure_x) + 60) set SL_2 (220 - SL_1) set figure_x (figure_x + 1) ][ set figure_Up_T_flag 0 if temp_ticks = 0[ set temp_ticks ticks ] ] ] ;;降低温度按键按下 if figure_Down_T_flag = 1[ ifelse figure_x < 2500[ set SL_2 ((sqrt figure_x) * 0.3 + 10) set SL_1 (50 - SL_2) set figure_x (figure_x + 1) ][ set figure_Down_T_flag 0 if temp_ticks = 0[ set temp_ticks ticks ] ] ] ;;增大压强按键按下 if figure_add_P_flag = 1[ ifelse figure_x < 2500[ set SL_2 ((sqrt figure_x) + 60) set SL_1 (220 - SL_2) set figure_x (figure_x + 1) ][ set figure_add_P_flag 0 if temp_ticks = 0[ set temp_ticks ticks ] ] ] ;;减少压强按键按下 if figure_delete_P_flag = 1[ ifelse figure_x < 2500[ set SL_1 ((sqrt figure_x) * 0.3 + 10) set SL_2 (50 - SL_1) set figure_x (figure_x + 1) ][ set figure_delete_P_flag 0 if temp_ticks = 0[ set temp_ticks ticks ] ] ] ;;恒压充入按键按下 if figure_add_in_flag = 1[ ifelse figure_x < 2500[ set SL_1 ((sqrt figure_x) * 0.3 + 10) set SL_2 (50 - SL_1) set figure_x (figure_x + 1) ][ set figure_add_in_flag 0 if temp_ticks = 0[ set temp_ticks ticks ] ] ] ;;figure_c_actant_flag 增大反应物浓度 if figure_c_actant_flag = 1[ ifelse figure_x < 2500[ set SL_2 ((sqrt figure_x) + 50) set SL_1 (200 - SL_2) set figure_x (figure_x + 1) ][ set figure_c_actant_flag 0 if temp_ticks = 0[ set temp_ticks ticks ] ] ] ;;figure_c_actant_flag 减小反应物浓度 if figure_c_actant_flag = 2[ ifelse figure_x < 2500[ set SL_1 ((sqrt figure_x) * 0.3 + 20) set SL_2 (70 - SL_1) set figure_x (figure_x + 1) ][ set figure_c_actant_flag 0 if temp_ticks = 0[ set temp_ticks ticks ] ] ] ;;figure_c_actant_flag 增大生成物浓度 if figure_c_resultant_flag = 1[ ifelse figure_x < 2500[ set SL_1 ((sqrt figure_x) + 50) set SL_2 (200 - SL_1) set figure_x (figure_x + 1) ][ set figure_c_resultant_flag 0 if temp_ticks = 0[ set temp_ticks ticks ] ] ] ;;figure_c_actant_flag 减小生成物浓度 if figure_c_resultant_flag = 2[ ifelse figure_x < 2500[ set SL_2 ((sqrt figure_x) * 0.3 + 20) set SL_1 (70 - SL_2) set figure_x (figure_x + 1) ][ set figure_c_resultant_flag 0 if temp_ticks = 0[ set temp_ticks ticks ] ] ] ] end ;;turtle不规则移动 to turtles_action ask mode7_no2_t [ ifelse (ycor >= (min-pycor + 2)) and (ycor <= float_y - 2) [ set heading random 360 ][ ;;碰下面 if (ycor >= (float_y - 2))[ set heading 180 ] ;;碰上面 if (ycor <= (min-pycor + 2))[ set heading 0 ] ] fd 1 ] ask mode7_n2o4_t [ ifelse (ycor >= (min-pycor + 2)) and (ycor <= float_y - 2) [ set heading random 360 ][ ;;碰下面 if (ycor >= (float_y - 2))[ set heading 180 ] ;;碰上面 if (ycor <= (min-pycor + 2))[ set heading 0 ] ] fd 1 ] ask mode7_he_t[ ifelse (ycor >= (min-pycor + 2)) and (ycor <= float_y - 2) [ set heading random 360 ][ ;;碰下面 if (ycor >= (float_y - 2))[ set heading 180 ] ;;碰上面 if (ycor <= (min-pycor + 2))[ set heading 0 ] ] fd 1 ] end ;;创建盖子 to create_float let result [] let current-value min-pxcor while [current-value <= max-pxcor] [ create-mode7_square_t 1 [ setxy current-value float_y ; 根据坐标对生成乌龟 set size 1.3 ; 可根据需要设置乌龟颜色 ] set current-value current-value + 1 ] create-mode7_square_t 1 [ setxy 0 (float_y + 1) ; 根据坐标对生成乌龟 set size 1.3 ; 可根据需要设置乌龟颜色 ] create-mode7_square_t 1 [ setxy 1 (float_y + 1) ; 根据坐标对生成乌龟 set size 1.3 ; 可根据需要设置乌龟颜色 ] create-mode7_square_t 1 [ setxy -1 (float_y + 1) ; 根据坐标对生成乌龟 set size 1.3 ; 可根据需要设置乌龟颜色 ] end ;;改变盖子的位置 to change_float_set if ticks mod 10000 = 0[ if old_float_y < float_y and float_y <= (max-pycor - 1)[ ask mode7_square_t[ set heading 360 ; 设置朝向为正上方 forward 1 ; 向前移动一格 ] set old_float_y (old_float_y + 1) ] if old_float_y > float_y and float_y > min-pycor[ ask mode7_square_t[ set heading 180 ; 设置朝向为正上方 forward 1 ; 向前移动一格 ] set old_float_y (old_float_y - 1 ) ] ] end ;;n2o4 和 no2相互反应 to reactivity let create_number 0 set Q ((count mode7_n2o4_t / V) / ((count mode7_no2_t / V) ^ 2) ) if Q < (K - 0.03) [ ask patches [ let nearby-turtles_count count turtles in-radius 1 let nearby-turtles turtles-here let to_n2o4_flag 0 let to_no2_flag 0 if nearby-turtles_count >= 2 [ if random-float 1.0 < 0.6 [ ask nearby-turtles[ if breed = mode7_no2_t[ set to_n2o4_flag (to_n2o4_flag + 1) ] if breed = mode7_n2o4_t[ set to_no2_flag (to_no2_flag + 1) ] ] if to_n2o4_flag >= 2[ if random-float 1.0 < 0.6 [ let first_mode7_no2_t one-of turtles in-radius 1 with [breed = mode7_no2_t] ask first_mode7_no2_t [ set breed mode7_n2o4_t set size 2 ] let second_mode7_no2_t one-of turtles in-radius 1 with [breed = mode7_no2_t] ask second_mode7_no2_t[ die ] ] ] if to_no2_flag >= 2[ if random-float 1.0 < 0.01 [ let first_mode7_n2o4_t one-of turtles in-radius 1 with [breed = mode7_n2o4_t] ask first_mode7_n2o4_t [ set breed mode7_no2_t set size 2 ] let second_mode7_n2o4_t one-of turtles in-radius 1 with [breed = mode7_n2o4_t] ask second_mode7_n2o4_t[ set breed mode7_no2_t set size 2 ] set create_number (create_number + 2) ] ] stop ] ] ] if create_number != 0 [ create-mode7_no2_t create_number[ setxy random-xcor random((min-pycor + 2) - (float_y - 2)) + (float_y - 2) set size 2 ] set create_number 0 ] ] if Q > (K - 0.03) and Q < (K + 0.03)[ ask patches [ let nearby-turtles_count count turtles in-radius 1 let nearby-turtles turtles-here let to_n2o4_flag 0 let to_no2_flag 0 if nearby-turtles_count >= 2 [ if random-float 1.0 < 0.1 [ ask nearby-turtles[ if breed = mode7_no2_t[ set to_n2o4_flag (to_n2o4_flag + 1) ] if breed = mode7_n2o4_t[ set to_no2_flag (to_no2_flag + 1) ] ] if to_n2o4_flag >= 2[ let first_mode7_no2_t one-of turtles in-radius 1 with [breed = mode7_no2_t] ask first_mode7_no2_t [ set breed mode7_n2o4_t set size 2 ] let second_mode7_no2_t one-of turtles in-radius 1 with [breed = mode7_no2_t] ask second_mode7_no2_t[ die ] ] if to_no2_flag >= 2[ let first_mode7_n2o4_t one-of turtles in-radius 1 with [breed = mode7_n2o4_t] ask first_mode7_n2o4_t [ set breed mode7_no2_t set size 2 ] let second_mode7_n2o4_t one-of turtles in-radius 1 with [breed = mode7_n2o4_t] ask second_mode7_n2o4_t[ set breed mode7_no2_t set size 2 ] set create_number (create_number + 2) ] stop ] ] ] if create_number != 0 [ create-mode7_no2_t create_number[ setxy random-xcor random((min-pycor + 2) - (old_float_y - 2)) + (old_float_y - 2) set size 2 ] set create_number 0 ] ] if Q > (K + 0.03) [ let x 0 let y 0 ask patches [ let nearby-turtles_count count turtles in-radius 1 let nearby-turtles turtles-here let to_n2o4_flag 0 let to_no2_flag 0 if nearby-turtles_count >= 2 [ if random-float 1.0 < 0.6 [ ask nearby-turtles[ if breed = mode7_no2_t[ set to_n2o4_flag (to_n2o4_flag + 1) ] if breed = mode7_n2o4_t[ set to_no2_flag (to_no2_flag + 1) ] ] if to_n2o4_flag >= 2[ if random-float 1.0 < 0.01 [ let first_mode7_no2_t one-of turtles in-radius 1 with [breed = mode7_no2_t] ask first_mode7_no2_t [ set breed mode7_n2o4_t set size 2 ] let second_mode7_no2_t one-of turtles in-radius 1 with [breed = mode7_no2_t] ask second_mode7_no2_t[ die ] ] ] if to_no2_flag >= 2[ if random-float 1.0 < 0.6 [ let first_mode7_n2o4_t one-of turtles in-radius 1 with [breed = mode7_n2o4_t] ask first_mode7_n2o4_t [ set x xcor set y ycor set breed mode7_no2_t set size 2 ] let second_mode7_n2o4_t one-of turtles in-radius 1 with [breed = mode7_n2o4_t] ask second_mode7_n2o4_t[ set breed mode7_no2_t set size 2 ] set create_number (create_number + 2) ] ] stop ] ] ] if create_number != 0 [ create-mode7_no2_t create_number[ setxy x y set size 2 ] set create_number 0 ] ] if figure_one_flag = 1[ ] end ;to V_1 ; if ticks mod 500 = 0[ ; set count_no2_new count mode7_no2_t ; let derta count_no2_new - count_no2 ; set SL_1 ((derta / 500) / 2 ) ; set count_no2 count_no2_new ; ] ;end ;;上升温度按键 to up_T end ;;降低温度按键 to down_T end ;;恒容充入按键 to add_V set figure_add_V_flag 1 set temp_ticks ticks create-mode7_he_t 50[ setxy random-xcor random((min-pycor + 2) - (float_y - 2)) + (float_y - 2) set size 2 ] end ;;恒压充入按键 to add_P set figure_add_in_flag 1 create-mode7_he_t 50[ setxy random-xcor random((min-pycor + 2) - (float_y - 2)) + (float_y - 2) set size 2 ] set float_y 20 set V 150 end ;;执行按键 to c_actant_action if c_actant > 0 [ set figure_c_actant_flag 1 create-mode7_no2_t c_actant[ setxy random-xcor random((min-pycor + 2) - (float_y - 2)) + (float_y - 2) set size 2 ] ] if c_actant < 0 [ set figure_c_actant_flag 2 let turtle_mode7_no2_t n-of (c_actant * -1) mode7_no2_t ask turtle_mode7_no2_t [ die ] ] end to c_resultant_action if c_resultant > 0 [ set figure_c_resultant_flag 1 create-mode7_n2o4_t c_resultant[ setxy random-xcor random((min-pycor + 2) - (float_y - 2)) + (float_y - 2) set size 2 ] ] if c_resultant < 0 [ set figure_c_resultant_flag 2 let turtle_mode7_n2o4_t n-of (c_resultant * -1) mode7_n2o4_t ask turtle_mode7_n2o4_t [ die ] ] end to add_cat set figure_add_cat_flag 1 set SL_1 70 set SL_2 70 set temp_ticks ticks end
There is only one version of this model, created 8 months ago by Ying Li.
This model does not have any ancestors.
This model does not have any descendants.