酸碱中和滴定
Model was written in NetLogo 6.4.0
•
Viewed 64 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.)
Info tab cannot be displayed because of an encoding error
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). Acid-Base Neutralization Titration. School of Chemistry and Chemical Engineering, Shaanxi Normal University. breed [ waters water ] ;; water molecules breed [ hydroxides hydroxide ] ;; base molecules breed [ hydroniums hydronium ] ;; acid molecules breed [mode2_ch3coo_s mode2_ch3coo_] ;;ch3coo_ molecules breed [mode2_ch3coohs mode2_ch3cooh] ;;ch3cooh molecules breed [mode2_cl_s mode2_cl_] ;;ch3coo_ molecules breed [mode2_h_s mode2_h_] ;;ch3cooh molecules breed [mode2_na_s mode2_na_] ;;ch3coo_ molecules breed [mode2_oh_s mode2_oh_] ;;ch3cooh molecules breed [mode2_waters mode2_water] ;;ch3cooh molecules globals [ base-added pH Strong_Co Weak_Co Base_Co Strong_PH Weak_PH Max_acid ;;当前的酸 Max_base ;;当前最大的碱量 Cur_base ;;当前加到的碱量 Limit_base ;;最大计算的量,与图的x_MAX保持一致,现在为40 drowing? cHAc_v cAc_v cNa+ cCl- cH+ cOH- ] to setup clear-all ;一起 if acid_switch = "together"[ set Strong_Co 0.1 set Weak_Co 0.1 ] ;初始化强酸、弱酸、碱、初始加的碱浓度 set base-added 0 set Base_Co 0.1 ;初始化最大酸量、当前碱量、最大碱量 set Limit_base 40 set Max_acid vol-acid set Cur_base 0 set Max_base 0 ;;设置画布颜色白色 ask patches [ set pcolor white ] set-default-shape mode2_ch3coo_s "mode2_ch3coo_" set-default-shape mode2_ch3coohs "mode2_ch3cooh" set-default-shape mode2_cl_s "mode2_cl_" set-default-shape mode2_h_s "mode2_h_" set-default-shape mode2_na_s "mode2_na_" set-default-shape mode2_oh_s "mode2_oh_" set-default-shape mode2_waters "mode2_water" ;画图 set drowing? false ;强酸部分 if acid_switch = "Strong acid" [ output-print " HCl+NaOH=NaCl+H2O " set Strong_Co 0.1 calculate-pH ;创建酸 ; create-mode2_cl_s (5 * vol-acid) ; [ ; setxy random-xcor random-ycor ; set color (yellow - 0.4) ; set size 0.8 ; ] create-mode2_h_s (5 * vol-acid) [ setxy random-xcor random-ycor set size 2 ] ] ;弱酸部分 if acid_switch = "Weak acid"[ output-print "CH3COOH+NaOH=CH3COONa+H2O" set Weak_Co 0.1 calculate-pH ;初始化创建弱酸画图醋酸分子 create-mode2_ch3coohs ((ceiling (5 * vol-acid * calculate_Weak_acid_HAC_derta))) [ setxy random-xcor random-ycor set size 2 ] create-mode2_ch3coo_s ((ceiling (5 * vol-acid * calculate_Weak_acid_AC_derta))) [ setxy random-xcor random-ycor set size 2 ] create-mode2_h_s ((ceiling (5 * vol-acid * calculate_Weak_acid_AC_derta))) [ setxy random-xcor random-ycor set size 2 ] ] reset-ticks end to go if ticks mod 1 = 0 [ ;强酸部分动态图 if acid_switch = "Strong acid" [ react ask turtles [ fd 1 ;; move turtles around randomly rt random 360 lt random 360 ] ;; around the world ] ;弱酸部分动态图 if acid_switch = "Weak acid"[ HAC_resolve react ask turtles [ fd 1 ;; move turtles around randomly rt random 360 lt random 360 ] ;; around the world ] ] calculate-pH ;画图部分动态增加 ifelse Cur_base < Limit_base [;40最大限制 ifelse ((Cur_base * 100) / 100) < Max_base[;加碱量限制 set drowing? true ifelse ((round (Cur_base * 100) / 100) mod 1 = 0) [ add_base_turtle 5 ][] set Cur_base (Cur_base + 0.05) ][ set drowing? false ] ][set drowing? false] if acid_switch = "Weak acid"[ set cHAc_v ( (precision ((10 ^ (- Weak_PH)) / ((10 ^ (- Weak_PH)) + 0.0000175)) 30 )* ( ( Max_acid * Weak_Co ) / ( Cur_base + Max_acid ) ) ) set cAc_v ( (precision (0.0000175 / ((10 ^ (- Weak_PH)) + 0.0000175)) 30 )* ( ( Max_acid * Weak_Co ) / ( Cur_base + Max_acid ) ) ) set cNa+ ( ( Cur_base * Base_Co ) / ( Cur_base + Max_acid ) ) set cH+ (10 ^(- Weak_PH)) set cOH- ((10 ^(-14))/ cH+ ) ] if acid_switch = "Strong acid"[ set cNa+ ( ( Cur_base * Base_Co ) / ( Cur_base + Max_acid ) ) set cCl- ( ( Max_acid * Strong_Co ) / ( Cur_base + Max_acid ) ) set cH+ (10 ^(- Strong_PH)) set cOH- ((10 ^(-14))/ cH+ ) ] tick end ;; adds hydroxide molecules to the solution to add-base ifelse (Max_base + vol-base) <= Limit_base[ set Max_base Max_base + vol-base set drowing? true ][set drowing? false] end to add_base_turtle [number] if acid_switch = "Strong acid"[ create-mode2_oh_s number [ set size 2 fd 1 ] ] if acid_switch = "Weak acid"[ create-mode2_oh_s number [ set size 1.5 fd 1 ] ] end ;; hydroxide procedure to react if acid_switch = "Strong acid"[ if ( Strong_PH < 1.5) [ ask mode2_h_s [ let meeting-mode2_oh_s mode2_oh_s in-radius 2 if count meeting-mode2_oh_s > 0 [ ; 在半径2的范围内相遇时,创建新的mode2_waters turtle let turtles-here-mode2_h_s turtles with [breed = mode2_h_s] let turtles-here-mode2_oh_s turtles with [breed = mode2_oh_s] let turtle_mode2_h_s one-of turtles-here-mode2_h_s in-radius 2 let turtle_mode2_oh_s one-of turtles-here-mode2_oh_s in-radius 2 if turtle_mode2_h_s != nobody and turtle_mode2_oh_s != nobody [ ask turtle_mode2_h_s [ set breed mode2_waters set size 2 ] ; 删除原来的mode2_oh_s turtle ask turtle_mode2_oh_s [ die ] ] ] ] ] if ( Strong_PH > 1.5) and ( Strong_PH < 6 )[ ask mode2_h_s [ let meeting-mode2_oh_s mode2_oh_s in-radius 10 if count meeting-mode2_oh_s > 0 [ ; 在半径2的范围内相遇时,创建新的mode2_waters turtle let turtles-here-mode2_h_s turtles with [breed = mode2_h_s] let turtles-here-mode2_oh_s turtles with [breed = mode2_oh_s] let turtle_mode2_h_s one-of turtles-here-mode2_h_s in-radius 5 let turtle_mode2_oh_s one-of turtles-here-mode2_oh_s in-radius 5 if turtle_mode2_h_s != nobody and turtle_mode2_oh_s != nobody [ ask turtle_mode2_h_s [ set breed mode2_waters set size 2 ] ; 删除原来的mode2_oh_s turtle ask turtle_mode2_oh_s [ die ] ] ] ] ] if ( Strong_PH > 6) and ( Strong_PH <= 7)[ ask mode2_oh_s [ set breed mode2_waters set size 2 ] ask mode2_h_s [ die ] ] ] if acid_switch = "Weak acid"[ if ( Weak_PH < 3) [ ask mode2_h_s [ let meeting-mode2_oh_s mode2_oh_s in-radius 2 if count meeting-mode2_oh_s > 0 [ ; 在半径2的范围内相遇时,创建新的mode2_waters turtle let turtles-here-mode2_h_s turtles with [breed = mode2_h_s] let turtles-here-mode2_oh_s turtles with [breed = mode2_oh_s] let turtle_mode2_h_s one-of turtles-here-mode2_h_s in-radius 2 let turtle_mode2_oh_s one-of turtles-here-mode2_oh_s in-radius 2 if turtle_mode2_h_s != nobody and turtle_mode2_oh_s != nobody [ ask turtle_mode2_h_s [ set breed mode2_waters set size 1.5 ] ; 删除原来的mode2_oh_s turtle ask turtle_mode2_oh_s [ die ] ] ] ] ] if ( Weak_PH > 3) and ( Weak_PH < 6 )[ ask mode2_h_s [ let meeting-mode2_oh_s mode2_oh_s in-radius 10 if count meeting-mode2_oh_s > 0 [ ; 在半径2的范围内相遇时,创建新的mode2_waters turtle let turtles-here-mode2_h_s turtles with [breed = mode2_h_s] let turtles-here-mode2_oh_s turtles with [breed = mode2_oh_s] let turtle_mode2_h_s one-of turtles-here-mode2_h_s in-radius 5 let turtle_mode2_oh_s one-of turtles-here-mode2_oh_s in-radius 5 if turtle_mode2_h_s != nobody and turtle_mode2_oh_s != nobody [ ask turtle_mode2_h_s [ set breed mode2_waters set size 1.5 ] ; 删除原来的mode2_oh_s turtle ask turtle_mode2_oh_s [ die ] ] ] ] ] if ( Weak_PH > 6) and ( Weak_PH <= 8.3)[ ask mode2_oh_s [ set breed mode2_waters set size 1.5 ] ask mode2_h_s [ die ] ] ] end ;; calculates the pH from the amount of the various ions in solution; ;; note that for simplicity the calculations don't take the true molar ;; concentration of water into account, but instead use an arbitrarily ;; chosen factor of 1000 to produce numbers lying in a reasonable range to calculate-pH ;强酸部分 if acid_switch != "Weak acid" [ ifelse Cur_base = 0 [ calculate_Strong_acid_ph_VBase0 ][] ifelse (Cur_base > 0) and (Cur_base < Max_acid - 0.05)[ calculate_Strong_acid_ph_VBase_less_Vacid ][] ifelse (Cur_base > 0) and (Cur_base >= Max_acid - 0.05) and (Cur_base <= Max_acid + 0.05) [ calculate_Strong_acid_ph_VBase_equ_Vacid ][] ifelse (Cur_base > 0) and (Cur_base > Max_acid + 0.05)[ calculate_Strong_acid_ph_VBase_greater_Vacid ][] ] ;弱酸部分 if acid_switch != "Strong acid"[ ifelse Cur_base = 0 [ calculate_Weak_acid_ph_VBase0 ][] ifelse (Cur_base > 0) and (Cur_base < 0.3 - 0.05)[ calculate_Weak_acid_ph_03_VBase_less_Vacid ][] ifelse (Cur_base >= 0.3) and (Cur_base < Max_acid - 0.05)[ calculate_Weak_acid_ph_VBase_less_Vacid ][] ifelse (Cur_base >= 0.3) and (Cur_base >= Max_acid - 0.05) and (Cur_base <= Max_acid + 0.05)[ calculate_Weak_acid_ph_VBase_equ_Vacid ][] ifelse (Cur_base >= 0.3) and (Cur_base > Max_acid + 0.05)[ calculate_Weak_acid_ph_VBase_greater_Vacid ][] ] if acid_switch != "together" [ if (Cur_base > (Max_acid + 0.04)) and (Cur_base < (Max_acid + 1))[ ask patches [ set pcolor pink + 4.7 ] ] if (Cur_base > (Max_acid + 1.04)) and (Cur_base < (Max_acid + 1.04 + 1))[ ask patches [ set pcolor pink + 4.7 - 0.2 ] ] if (Cur_base > (Max_acid + 2.04)) and (Cur_base < (Max_acid + 2.04 + 1))[ ask patches [ set pcolor pink + 4.7 - 0.4 ] ] if (Cur_base > (Max_acid + 3.04)) and (Cur_base < (Max_acid + 3.04 + 1))[ ask patches [ set pcolor pink + 4.7 - 0.6 ] ] if (Cur_base > (Max_acid + 4.04)) and (Cur_base < (Max_acid + 4.04 + 1))[ ask patches [ set pcolor pink + 4.7 - 0.8 ] ] if (Cur_base > (Max_acid + 5.04)) and (Cur_base < (Max_acid + 5.04 + 1))[ ask patches [ set pcolor pink + 4.7 - 1 ] ] ] end ;;强酸计算:初始 to calculate_Strong_acid_ph_VBase0 set Strong_PH (- (ln (Strong_Co) / ln 10)) end ;;弱酸计算:初始 to calculate_Weak_acid_ph_VBase0 set Weak_PH (- (ln ((sqrt (0.0000175 * 0.0000175 + 4 * 0.0000175 * Weak_Co ) - 0.0000175) / 2)/ ln 10)) end ;;强酸计算:Vbase < Vacid to calculate_Strong_acid_ph_VBase_less_Vacid set Strong_PH (- (ln( (((Max_acid - Cur_base) * Strong_Co) / (Max_acid + Cur_base))) / ln 10)) end ;;弱酸计算:Vbase < Vacid 且 Vbase < 0.3 to calculate_Weak_acid_ph_03_VBase_less_Vacid set Weak_PH (- (ln ((sqrt (0.0000175 * 0.0000175 + 4 * 0.0000175 * ((Weak_Co * Max_acid) / (Max_acid + Cur_base))) - 0.0000175) / 2)/ ln 10)) end ;;弱酸计算:Vbase < Vacid to calculate_Weak_acid_ph_VBase_less_Vacid set Weak_PH (-(ln(0.0000175) / ln 10 ) + (ln ( Cur_base / ( Max_acid - Cur_base ) ) / ln 10)) end ;;强酸计算:Vbase = Vacid to calculate_Strong_acid_ph_VBase_equ_Vacid set Strong_PH 7 end ;;弱酸计算:Vbase = Vacid to calculate_Weak_acid_ph_VBase_equ_Vacid set Weak_PH (14 + (ln ((sqrt ((0.0000000005714 * 0.0000000005714) + 4 * 0.0000000005714 * ((Weak_Co * Max_acid) / (Max_acid + Cur_base))) - 0.0000000005714) / 2 ) / ln 10)) end ;;强酸计算:Vbase > Vacid to calculate_Strong_acid_ph_VBase_greater_Vacid set Strong_PH (14 + (ln ( ( ( Cur_base - Max_acid ) * Base_Co ) / ( Cur_base + Max_acid ) ) / ln 10)) end ;;弱酸计算:Vbase > Vacid to calculate_Weak_acid_ph_VBase_greater_Vacid set Weak_PH (14 + (ln ( ( ( Cur_base - Max_acid ) * Base_Co ) / ( Cur_base + Max_acid ) ) / ln 10)) end ;;弱酸画图所需的HAC分布系数 to-report calculate_Weak_acid_HAC_derta report precision ((10 ^ (- Weak_PH)) / ((10 ^ (- Weak_PH)) + 0.0000175)) 2 end ;;弱酸画图所需的AC分布系数 to-report calculate_Weak_acid_AC_derta report precision (0.0000175 / ((10 ^ (- Weak_PH)) + 0.0000175)) 2 end ;依据分布系数更新醋酸的量使其变成醋酸分子和氢 to HAC_resolve ;依据分布系数计算HAC数量 let number (ceiling (5 * vol-acid * calculate_Weak_acid_HAC_derta)) let cur_number count mode2_ch3coohs if number < cur_number[ let resolve_number (cur_number - number) ask n-of resolve_number mode2_ch3coohs [ set breed mode2_ch3coo_s set size 2 ] create-mode2_h_s (resolve_number) [ set size 2 ] ] end
There is only one version of this model, created 6 months ago by Ying Li.
This model does not have any ancestors.
This model does not have any descendants.