@jjlmoya/utils-science 1.27.0 → 1.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +3 -1
  3. package/src/entries.ts +5 -1
  4. package/src/index.ts +2 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/entropy-second-law/bibliography.astro +14 -0
  8. package/src/tool/entropy-second-law/bibliography.ts +12 -0
  9. package/src/tool/entropy-second-law/component.astro +366 -0
  10. package/src/tool/entropy-second-law/entropy-second-law-simulator.css +445 -0
  11. package/src/tool/entropy-second-law/entry.ts +26 -0
  12. package/src/tool/entropy-second-law/i18n/de.ts +210 -0
  13. package/src/tool/entropy-second-law/i18n/en.ts +210 -0
  14. package/src/tool/entropy-second-law/i18n/es.ts +210 -0
  15. package/src/tool/entropy-second-law/i18n/fr.ts +210 -0
  16. package/src/tool/entropy-second-law/i18n/id.ts +210 -0
  17. package/src/tool/entropy-second-law/i18n/it.ts +210 -0
  18. package/src/tool/entropy-second-law/i18n/ja.ts +210 -0
  19. package/src/tool/entropy-second-law/i18n/ko.ts +210 -0
  20. package/src/tool/entropy-second-law/i18n/nl.ts +210 -0
  21. package/src/tool/entropy-second-law/i18n/pl.ts +210 -0
  22. package/src/tool/entropy-second-law/i18n/pt.ts +210 -0
  23. package/src/tool/entropy-second-law/i18n/ru.ts +210 -0
  24. package/src/tool/entropy-second-law/i18n/sv.ts +210 -0
  25. package/src/tool/entropy-second-law/i18n/tr.ts +210 -0
  26. package/src/tool/entropy-second-law/i18n/zh.ts +210 -0
  27. package/src/tool/entropy-second-law/index.ts +11 -0
  28. package/src/tool/entropy-second-law/logic.ts +208 -0
  29. package/src/tool/entropy-second-law/seo.astro +15 -0
  30. package/src/tool/phase-diagram-critical-points/bibliography.astro +14 -0
  31. package/src/tool/phase-diagram-critical-points/bibliography.ts +16 -0
  32. package/src/tool/phase-diagram-critical-points/component.astro +397 -0
  33. package/src/tool/phase-diagram-critical-points/entry.ts +26 -0
  34. package/src/tool/phase-diagram-critical-points/i18n/de.ts +179 -0
  35. package/src/tool/phase-diagram-critical-points/i18n/en.ts +181 -0
  36. package/src/tool/phase-diagram-critical-points/i18n/es.ts +179 -0
  37. package/src/tool/phase-diagram-critical-points/i18n/fr.ts +179 -0
  38. package/src/tool/phase-diagram-critical-points/i18n/id.ts +179 -0
  39. package/src/tool/phase-diagram-critical-points/i18n/it.ts +179 -0
  40. package/src/tool/phase-diagram-critical-points/i18n/ja.ts +179 -0
  41. package/src/tool/phase-diagram-critical-points/i18n/ko.ts +179 -0
  42. package/src/tool/phase-diagram-critical-points/i18n/nl.ts +179 -0
  43. package/src/tool/phase-diagram-critical-points/i18n/pl.ts +179 -0
  44. package/src/tool/phase-diagram-critical-points/i18n/pt.ts +179 -0
  45. package/src/tool/phase-diagram-critical-points/i18n/ru.ts +179 -0
  46. package/src/tool/phase-diagram-critical-points/i18n/sv.ts +179 -0
  47. package/src/tool/phase-diagram-critical-points/i18n/tr.ts +179 -0
  48. package/src/tool/phase-diagram-critical-points/i18n/zh.ts +179 -0
  49. package/src/tool/phase-diagram-critical-points/index.ts +11 -0
  50. package/src/tool/phase-diagram-critical-points/logic.ts +179 -0
  51. package/src/tool/phase-diagram-critical-points/phase-diagram-critical-points-visualizer.css +542 -0
  52. package/src/tool/phase-diagram-critical-points/seo.astro +15 -0
  53. package/src/tools.ts +4 -0
@@ -0,0 +1,210 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+
4
+ const slug = 'entropi-ikinci-yasa-simulatoru';
5
+ const title = 'Entropi ve Termodinamiğin İkinci Yasası Simülatörü';
6
+ const description = 'Sıcak ve soğuk parçacık odalarının karışmasını, dengelenmesini ve entropiyi yükseltmesini görsel bir difüzyon simülatörü ve canlı entropi grafiği ile izleyin.';
7
+
8
+ const howTo = [
9
+ {
10
+ name: 'Sol ve sağ sıcaklıkları ayarlayın',
11
+ text: 'Bir başlangıç termal dengesizliği oluşturmak için daha soğuk bir oda ve daha sıcak bir oda seçin. Fark büyüdükçe dengeye doğru geri dönüşü olmayan yaklaşımı görmek kolaylaşır.',
12
+ },
13
+ {
14
+ name: 'Bariyer açıklığını ayarlayın',
15
+ text: 'İki oda arasındaki geçidi açın veya daraltın. Daha geniş bir açıklık, parçacıkların ve enerjinin daha hızlı yayılmasını sağlar, böylece entropi eğrisi daha hızlı yükselir.',
16
+ },
17
+ {
18
+ name: 'Parçacık kutusunu gözlemleyin',
19
+ text: 'Mavi parçacıklar düşük enerjili hareketi, turuncu parçacıklar ise yüksek enerjili hareketi temsil eder. Çarpışmalar ve geçişler biriktikçe kutu daha karışık ve daha az düzenli hale gelir.',
20
+ },
21
+ {
22
+ name: 'Entropi grafiğini okuyun',
23
+ text: 'Mekansal karışma ve termal dengelemenin tek bir yükselen entropi puanında nasıl birleştiğini takip edin. Eğri, izole sistemlerin neden daha olası makro durumlara doğru evrildiğine dair sezgi geliştirmek içindir.',
24
+ },
25
+ ];
26
+
27
+ const faq = [
28
+ {
29
+ question: 'Bu simülatörde entropi neden yükseliyor?',
30
+ answer: 'Başlangıç durumu yapay olarak düzenlenmiştir: bir taraf daha soğuk, diğer taraf daha sıcaktır. Bariyer değişime izin verdiğinde, ayrılmış düzenlemelerden çok daha fazla karışık düzenleme vardır, bu nedenle sistem doğal olarak ezici bir şekilde daha olası olan makro duruma doğru hareket eder.',
31
+ },
32
+ {
33
+ question: 'Bu, ikinci yasayı tam olarak kanıtlıyor mu?',
34
+ answer: 'Hayır. Bu, moleküler dinamik laboratuvar kodu değil, didaktik bir parçacık modelidir. Kullanıcıların entropinin neden artma eğiliminde olduğunu sorduklarında sahip oldukları arama amacı olan geri dönüşümsüz difüzyon ve termal dengelemenin ardındaki temel sezgiyi yakalar.',
35
+ },
36
+ {
37
+ question: 'Burada uzamsal entropi ve termal entropi ne anlama geliyor?',
38
+ answer: 'Uzamsal entropi, parçacıkların sol ve sağ odalar arasında ne kadar eşit dağıldığını ölçer. Bu simülatördeki termal entropi, iki yarı arasındaki enerji boşluğunun ne kadar küçük olduğunu ölçer. Toplam puan, kullanıcıların karışma ve ısı akışını aynı anda görebilmesi için her ikisini harmanlar.',
39
+ },
40
+ {
41
+ question: 'Dengeye yakınken bile parçacıklar neden hareket etmeye devam ediyor?',
42
+ answer: 'Denge, hareketin durduğu anlamına gelmez. Makroskobik dengesizliğin ortadan kalktığı anlamına gelir. Moleküller hâlâ hareket eder, çarpışır ve enerji alışverişi yapar, ancak kullanılacak kalıcı bir büyük ölçekli yön kalmamıştır.',
43
+ },
44
+ {
45
+ question: 'Entropi hiçbir zaman anlık olarak azalabilir mi?',
46
+ answer: 'Mikroskobik sistemlerde küçük dalgalanmalar mümkündür. Bu görsel araç, bu dalgalanmaları yumuşatır ve genel istatistiksel eğilimi vurgular: büyük bir izole sistemde, düşük entropili düzenli durumlar, karışık durumlardan çok daha az olasıdır.',
47
+ },
48
+ ];
49
+
50
+ export const content: ToolLocaleContent = {
51
+ slug,
52
+ title,
53
+ description,
54
+ ui: {
55
+ status: 'Geri dönüşümsüz karışma',
56
+ results: 'Entropi simülatörü sonuçları',
57
+ particleBox: 'Parçacık difüzyon kutusu',
58
+ barrier: 'Bariyer',
59
+ entropyGraph: 'Zaman içinde entropi grafiği',
60
+ liveTrace: 'Canlı iz',
61
+ highEntropy: 'yüksek',
62
+ midEntropy: 'orta',
63
+ lowEntropy: 'düşük',
64
+ controls: 'Entropi simülatörü kontrolleri',
65
+ leftTemperature: 'Sol sıcaklık',
66
+ rightTemperature: 'Sağ sıcaklık',
67
+ gateAperture: 'Bariyer açıklığı',
68
+ pause: 'Duraklat',
69
+ reset: 'Durumu sıfırla',
70
+ resume: 'Devam et',
71
+ totalEntropy: 'Toplam entropi',
72
+ particleBalance: 'Sol/sağ parçacıklar',
73
+ spatialEntropy: 'Uzamsal entropi',
74
+ thermalEntropy: 'Termal entropi',
75
+ energyGap: 'Enerji boşluğu',
76
+ noteLabel: 'Yorum',
77
+ stateGradient: 'Gradyan',
78
+ stateMixing: 'Karışma',
79
+ stateEquilibrium: 'Denge',
80
+ note: 'Makro durum olasılığı maksimum düzensizliğe işaret eder.',
81
+ },
82
+ seo: [
83
+ {
84
+ type: 'title',
85
+ text: 'Termodinamiğin ikinci yasası ve geri dönüşümsüz difüzyon için entropi simülatörü',
86
+ level: 2,
87
+ },
88
+ {
89
+ type: 'paragraph',
90
+ html: 'Bu entropi simülatörünü fiziğin en önemli fikirlerinden birini görselleştirmek için kullanın: izole sistemler, yapay olarak düzenlenmiş durumlardan daha olası karışık durumlara doğru evrilir. Statik bir entropi tanımını okumak yerine, canlı bir eğri düzensizliğin yükselişini izlerken sıcak bir oda ile soğuk bir odanın gerçek zamanlı olarak parçacık ve enerji alışverişini izleyebilirsiniz.',
91
+ },
92
+ {
93
+ type: 'paragraph',
94
+ html: 'Bu araç, "entropi neden artar", "ikinci yasa nasıl çalışır" ve "termal difüzyon nedir" gibi soruların ardındaki en yaygın arama amacı için tasarlanmıştır. Amaç sadece düzensizlik hakkında bir slogan vermek değil, entropiyi olasılık, ısı akışı, karışma ve denge ile anında görünür hissettiren bir şekilde ilişkilendirmektir.',
95
+ },
96
+ {
97
+ type: 'title',
98
+ text: 'Termodinamiğin ikinci yasasının pratik anlamı',
99
+ level: 3,
100
+ },
101
+ {
102
+ type: 'paragraph',
103
+ html: 'İkinci yasa, izole bir sistem için kendiliğinden süreçlerin daha yüksek entropili makro durumlara doğru hareket ettiğini söyler. Günlük dilde bu, sıcak parçacıklar bir tarafta ve soğuk parçacıklar diğer tarafta olacak şekilde güçlü bir şekilde organize edilmiş bir termal düzenlemenin, onu sürdürmek için sürekli iş sağlanmadıkça ayrı kalmayacağı anlamına gelir.',
104
+ },
105
+ {
106
+ type: 'paragraph',
107
+ html: 'Bu, maddenin mistik bir anlamda "kaosu tercih etmesi" nedeniyle olmaz. Karışık bir duruma karşılık gelen mikroskobik düzenlemelerin, ayrılmış bir durumdan çok daha fazla olması nedeniyle olur. Bu nedenle entropi, termodinamiği sayma ile ilişkilendirir: uyumlu mikro durumların sayısı ne kadar büyükse, entropi de o kadar büyük olur.',
108
+ },
109
+ {
110
+ type: 'title',
111
+ text: 'Bu entropi difüzyon simülatörü nasıl çalışır',
112
+ level: 3,
113
+ },
114
+ {
115
+ type: 'paragraph',
116
+ html: 'Parçacık kutusu, bir bariyer boyunca sıcaklık dengesizliği olan düşük entropili bir konfigürasyonda başlar. Odalar arasındaki geçit açıkken, parçacıklar geçer, çarpışır ve enerjiyi bir taraftan diğerine taşır. Simülasyon iki sezgisel bileşeni izler: parçacıklar daha az ayrıştıkça artan <strong>uzamsal entropi</strong> ve sol ve sağ enerji dağılımları daha az farklı hale geldikçe artan <strong>termal entropi</strong>.',
117
+ },
118
+ {
119
+ type: 'paragraph',
120
+ html: 'Ekranda gösterilen toplam entropi puanı, bu iki bileşenden oluşturulmuş bir öğretim vekilidir. Laboratuvar sınıfı bir durum işlevi değildir ve tam istatistiksel mekaniği yeniden ürettiğini iddia etmez. Amacı, kullanıcıların doğru sezgiyi geliştirmesine yardımcı olmaktır: geri dönüşümsüz ısı akışı ve difüzyon, sistemi dengeye doğru hareket ettirir çünkü denge çok daha fazla erişilebilir düzenlemeye karşılık gelir.',
121
+ },
122
+ {
123
+ type: 'table',
124
+ headers: ['Görsel sinyal', 'Temsil ettiği şey', 'Neden önemli'],
125
+ rows: [
126
+ ['Mavi vs turuncu parçacıklar', 'Bağıl kinetik enerji', 'Sıcaklık farklılıklarının aslında ortalama mikroskobik hareket farklılıkları olduğunu gösterir.'],
127
+ ['Bariyer açıklığı', 'Odalar arası değişim kolaylığı', 'Taşıma yolu değiştiğinde difüzyon hızının neden değiştiğini görmenizi sağlar.'],
128
+ ['Uzamsal entropi ölçer', 'Parçacıkların ne kadar eşit yayıldığı', 'Sadece karışmanın bile makro durumu daha olası hale getirdiğini açıklar.'],
129
+ ['Termal entropi ölçer', 'Sol-sağ enerji boşluğunun ne kadar küçüldüğü', 'Dengenin sadece konumla değil, aynı zamanda enerji paylaşımıyla da ilgili olduğunu gösterir.'],
130
+ ['Entropi eğrisi', 'Zaman içindeki eğilim', 'Geri dönüşümsüzlük soyut fikrini görünür bir tek yönlü gevşeme sürecine dönüştürür.'],
131
+ ],
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: 'Her parçacık basit harekete uyarken entropi neden artabilir?',
136
+ level: 3,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: 'Öğrenciler genellikle ikinci yasanın sürtünme, niyet veya özel bir "zaman oku kuvveti" gerektirdiğini varsayar. Daha derin nokta istatistikseldir. Her parçacık yerel kurallara uyar, ancak birçok parçacık etkileşime girdiğinde, karışık makro durumların sayısı düzenli makro durumların sayısını tamamen domine eder. Bu nedenle sistem neredeyse tüm zamanını karışık konfigürasyonlarda ve yalnızca son derece küçük bir kısmını düzgün bir şekilde ayrılmış olanlarda geçirir.',
141
+ },
142
+ {
143
+ type: 'paragraph',
144
+ html: 'Bu nedenle bir damla boya suda yayılır, bir ısıtıcı kapatıldıktan sonra bir odanın sıcaklığı dengelenir ve sıcak bir nesne daha soğuk bir nesneyle temas ettiğinde soğur. Ters süreç, katı mikroskobik anlamda Newton hareketi tarafından yasaklanmamıştır, ancak büyük sistemler için istatistiksel olarak o kadar olasılık dışıdır ki insan ölçeğinde etkili bir şekilde asla gözlemlenmez.',
145
+ },
146
+ {
147
+ type: 'title',
148
+ text: 'Entropi, denge ve yaygın yanılgılar',
149
+ level: 3,
150
+ },
151
+ {
152
+ type: 'list',
153
+ items: [
154
+ '<strong>Entropi sadece "dağınıklık" değildir:</strong> daha kesin fikir, aynı makroskobik tanımla uyumlu mikroskobik düzenlemelerin sayısıdır.',
155
+ '<strong>Denge hareketsizlik anlamına gelmez:</strong> parçacıklar sürekli hareket etmeye devam eder, ancak büyük ölçekli dengesizlikleri birbirini götürür.',
156
+ '<strong>Isı akışı yönlüdür çünkü olasılık yönlüdür:</strong> enerjiyi keskin bir şekilde ayrı tutmaktan çok daha fazla paylaşma yolu vardır.',
157
+ '<strong>Düşük entropi imkansız değildir:</strong> sadece izole sistemin dışından kısıtlamalar, hazırlık veya iş gerektirir.',
158
+ '<strong>Bu simülatör niteldir:</strong> kesin kalorimetri, bölüşüm fonksiyonları veya moleküler taşıma katsayıları değil, fiziksel sezgi sağlar.',
159
+ ],
160
+ },
161
+ {
162
+ type: 'title',
163
+ text: 'Bu simülatör ne zaman kullanılmalı',
164
+ level: 3,
165
+ },
166
+ {
167
+ type: 'paragraph',
168
+ html: 'Sınıf gösterimleri, fizik tekrarı, kimya eğitimi, bilim yazarlığı ve hızlı kavramsal açıklamalar için kullanın. Özellikle ısının sıcaktan soğuğa aktığını anlayan ancak bunun olasılık, makro durum sayımı ve termodinamiğin ikinci yasasıyla nasıl bağlantılı olduğunu henüz göremeyen biri için faydalıdır.',
169
+ },
170
+ {
171
+ type: 'paragraph',
172
+ html: 'Amacınız gerçek bir gaz, motor çevrimi veya laboratuvar sistemi için titiz bir termodinamik hesaplama ise, durum denklemlerine, sınır koşullarına ve deneysel olarak temellendirilmiş parametrelere ihtiyacınız olacaktır. Amacınız difüzyonun neden geri dönüşümsüz olduğu ve entropinin neden yükselme eğiliminde olduğu konusunda sezgi ise, bu simülatör tam da bu soru için inşa edilmiştir.',
173
+ },
174
+ ],
175
+ faq,
176
+ bibliography,
177
+ howTo,
178
+ schemas: [
179
+ {
180
+ '@context': 'https://schema.org',
181
+ '@type': 'SoftwareApplication',
182
+ name: title,
183
+ description,
184
+ applicationCategory: 'ScientificApplication',
185
+ operatingSystem: 'Any',
186
+ },
187
+ {
188
+ '@context': 'https://schema.org',
189
+ '@type': 'FAQPage',
190
+ mainEntity: faq.map((item) => ({
191
+ '@type': 'Question',
192
+ name: item.question,
193
+ acceptedAnswer: {
194
+ '@type': 'Answer',
195
+ text: item.answer,
196
+ },
197
+ })),
198
+ },
199
+ {
200
+ '@context': 'https://schema.org',
201
+ '@type': 'HowTo',
202
+ name: title,
203
+ step: howTo.map((step) => ({
204
+ '@type': 'HowToStep',
205
+ name: step.name,
206
+ text: step.text,
207
+ })),
208
+ },
209
+ ],
210
+ };
@@ -0,0 +1,210 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+
4
+ const slug = 'entropy-second-law-simulator';
5
+ const title = '熵与热力学第二定律模拟器';
6
+ const description = '通过可视化扩散模拟器和实时熵值图表,观察热粒子室与冷粒子室混合、均衡并推动熵增的过程。';
7
+
8
+ const howTo = [
9
+ {
10
+ name: '设置左右温度',
11
+ text: '选择一个较冷的腔室和一个较热的腔室,以产生初始的热不平衡。温差越大,系统不可逆地趋向平衡的过程就越容易观察。',
12
+ },
13
+ {
14
+ name: '调节隔板开口',
15
+ text: '打开或收窄两个腔室之间的通道。开口越宽,粒子和能量的扩散速度就越快,熵值曲线的上升也就越迅速。',
16
+ },
17
+ {
18
+ name: '观察粒子箱',
19
+ text: '蓝色粒子代表低能量运动,橙色粒子代表高能量运动。随着碰撞和穿行的累积,粒子箱内变得越来越混合,有序度不断降低。',
20
+ },
21
+ {
22
+ name: '解读熵值图表',
23
+ text: '追踪空间混合与热均衡如何共同形成一个持续上升的熵值评分。该曲线旨在帮助直观理解孤立系统为何会向概率更高的宏观态演化。',
24
+ },
25
+ ];
26
+
27
+ const faq = [
28
+ {
29
+ question: '为什么在这个模拟器中熵会增加?',
30
+ answer: '初始状态是人为有序的:一侧较冷,另一侧较热。一旦隔板允许交换,混合排列的数量远远多于分离排列的数量,因此系统自然地向概率压倒性地更高的宏观态移动。',
31
+ },
32
+ {
33
+ question: '这能精确证明第二定律吗?',
34
+ answer: '不能。这是一个教学用的粒子模型,而非分子动力学实验室代码。它捕捉了不可逆扩散和热均衡背后的核心直觉,这正是大多数用户询问熵为何趋于增加时的搜索意图。',
35
+ },
36
+ {
37
+ question: '这里的空间熵和热熵是什么意思?',
38
+ answer: '空间熵衡量粒子在左右两个腔室之间分布的均匀程度。该模拟器中的热熵衡量两半之间能量差距的大小。总熵值将两者融合,使用户可以同时观察混合和热流。',
39
+ },
40
+ {
41
+ question: '为什么即使在接近平衡时粒子仍在运动?',
42
+ answer: '平衡并不意味着运动停止。它意味着宏观不平衡的消失。分子仍然在运动、碰撞和交换能量,只是不再有可利用的持续大规模方向性。',
43
+ },
44
+ {
45
+ question: '熵值会不会瞬间减小?',
46
+ answer: '在微观系统中,小的涨落是可能的。这个可视化工具平滑了这些涨落,并强调整体的统计趋势:在一个大型孤立系统中,低熵有序状态的概率远低于混合状态。',
47
+ },
48
+ ];
49
+
50
+ export const content: ToolLocaleContent = {
51
+ slug,
52
+ title,
53
+ description,
54
+ ui: {
55
+ status: '不可逆混合',
56
+ results: '熵模拟器结果',
57
+ particleBox: '粒子扩散箱',
58
+ barrier: '隔板',
59
+ entropyGraph: '熵值随时间变化图',
60
+ liveTrace: '实时轨迹',
61
+ highEntropy: '高',
62
+ midEntropy: '中',
63
+ lowEntropy: '低',
64
+ controls: '熵模拟器控制',
65
+ leftTemperature: '左侧温度',
66
+ rightTemperature: '右侧温度',
67
+ gateAperture: '隔板开口',
68
+ pause: '暂停',
69
+ reset: '重置状态',
70
+ resume: '继续',
71
+ totalEntropy: '总熵',
72
+ particleBalance: '左右粒子数',
73
+ spatialEntropy: '空间熵',
74
+ thermalEntropy: '热熵',
75
+ energyGap: '能量差',
76
+ noteLabel: '解读',
77
+ stateGradient: '梯度',
78
+ stateMixing: '混合',
79
+ stateEquilibrium: '平衡',
80
+ note: '宏观态概率指向最大无序。',
81
+ },
82
+ seo: [
83
+ {
84
+ type: 'title',
85
+ text: '热力学第二定律与不可逆扩散的熵模拟器',
86
+ level: 2,
87
+ },
88
+ {
89
+ type: 'paragraph',
90
+ html: '使用这个熵模拟器来可视化物理学中最重要的概念之一:孤立系统从人为有序状态向更可能的混合状态演化。无需阅读熵的静态定义,你可以观察热室与冷室实时交换粒子和能量,同时一条实时曲线追踪着无序度的上升。',
91
+ },
92
+ {
93
+ type: 'paragraph',
94
+ html: '该工具专为"为什么熵会增加"、"第二定律如何工作"以及"什么是热扩散"等问题背后最常见的搜索意图而设计。目标不仅仅是给出关于无序的口号,而是以直观可见的方式将熵与概率、热流、混合和平衡联系起来。',
95
+ },
96
+ {
97
+ type: 'title',
98
+ text: '热力学第二定律在实际中意味着什么',
99
+ level: 3,
100
+ },
101
+ {
102
+ type: 'paragraph',
103
+ html: '第二定律指出,对于孤立系统,自发过程会向熵值更高的宏观态发展。用日常语言来说,这意味着一个高度有序的热布局,例如热粒子在一侧而冷粒子在另一侧,除非持续提供功来维持,否则无法保持分离状态。',
104
+ },
105
+ {
106
+ type: 'paragraph',
107
+ html: '这并非因为物质在神秘意义上"偏爱混沌"。而是因为对应于混合态的微观排列数量远远超过分离态。因此,熵将热力学与计数联系起来:兼容的微观态数量越大,熵值就越大。',
108
+ },
109
+ {
110
+ type: 'title',
111
+ text: '这个熵扩散模拟器的工作原理',
112
+ level: 3,
113
+ },
114
+ {
115
+ type: 'paragraph',
116
+ html: '粒子箱从一种低熵构型开始,隔板两侧存在温度不平衡。当腔室之间的通道打开时,粒子穿越、碰撞并将能量从一侧携带到另一侧。该模拟追踪两个直观的要素:<strong>空间熵</strong>(随着粒子分离度降低而增加)和<strong>热熵</strong>(随着左右能量分布差异缩小而增加)。',
117
+ },
118
+ {
119
+ type: 'paragraph',
120
+ html: '屏幕上显示的总熵评分是由这两个要素构建的教学代理指标。它不是实验室级别的状态函数,也不声称能重现完整的统计力学。其目的是帮助用户建立正确的直觉:不可逆热流和扩散都将系统推向平衡,因为平衡对应着更多可及的排列方式。',
121
+ },
122
+ {
123
+ type: 'table',
124
+ headers: ['视觉信号', '代表含义', '重要性'],
125
+ rows: [
126
+ ['蓝色与橙色粒子', '相对动能', '表明温度差异实际上是平均微观运动的差异。'],
127
+ ['隔板开口', '腔室间交换的难易程度', '让你理解为什么运输路径改变时扩散速率会发生变化。'],
128
+ ['空间熵计量器', '粒子的均匀分布程度', '说明仅混合本身就已使宏观态概率更高。'],
129
+ ['热熵计量器', '左右能量差距的缩小程度', '表明平衡不仅关乎位置,还关乎能量的共享。'],
130
+ ['熵值曲线', '随时间变化的趋势', '将不可逆性的抽象概念转化为可见的单向弛豫过程。'],
131
+ ],
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: '为什么每个粒子都遵循简单运动,熵却能增加?',
136
+ level: 3,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: '学生常常认为第二定律需要摩擦力、意图或一种特殊的"时间之箭力"。更深层的要点是统计性的。每个粒子都遵循局部规则,但当许多粒子相互作用时,混合宏观态的数量完全压倒了有序宏观态的数量。因此,系统几乎将所有时间都花在混合构型上,而只有极微小的一部分时间花在整齐分离的构型上。',
141
+ },
142
+ {
143
+ type: 'paragraph',
144
+ html: '这就是为什么一滴染料在水中扩散,为什么关闭加热器后房间温度会均衡,以及为什么热物体与冷物体接触时会冷却。反向过程在严格的微观意义上并不被牛顿运动所禁止,但对于大型系统来说统计上极不可能,因此在人类尺度上实际上从未被观察到。',
145
+ },
146
+ {
147
+ type: 'title',
148
+ text: '熵、平衡与常见误解',
149
+ level: 3,
150
+ },
151
+ {
152
+ type: 'list',
153
+ items: [
154
+ '<strong>熵不仅仅是"杂乱":</strong>更精确的概念是与相同宏观描述兼容的微观排列数量。',
155
+ '<strong>平衡并不意味着静止:</strong>粒子持续运动,但它们的大规模不平衡相互抵消。',
156
+ '<strong>热流具有方向性是因为概率具有方向性:</strong>共享能量的方式远比保持其尖锐分离的方式多得多。',
157
+ '<strong>低熵并非不可能:</strong>它只需要来自孤立系统外部的约束、准备或做功。',
158
+ '<strong>此模拟器是定性的:</strong>它提供物理直觉,而非精确的量热、配分函数或分子输运系数。',
159
+ ],
160
+ },
161
+ {
162
+ type: 'title',
163
+ text: '何时使用此模拟器',
164
+ level: 3,
165
+ },
166
+ {
167
+ type: 'paragraph',
168
+ html: '用于课堂演示、物理复习、化学教育、科学写作和快速概念解释。当有人理解热量从高温流向低温,但尚未看清这与概率、宏观态计数以及热力学第二定律之间的关联时,此工具尤为有用。',
169
+ },
170
+ {
171
+ type: 'paragraph',
172
+ html: '如果你的目标是针对真实气体、发动机循环或实验室系统进行严格的热力学计算,你将需要状态方程、边界条件和实验验证的参数。如果你的目标是理解扩散为何不可逆以及熵为何趋于增加,那么这个模拟器正是为此问题而构建的。',
173
+ },
174
+ ],
175
+ faq,
176
+ bibliography,
177
+ howTo,
178
+ schemas: [
179
+ {
180
+ '@context': 'https://schema.org',
181
+ '@type': 'SoftwareApplication',
182
+ name: title,
183
+ description,
184
+ applicationCategory: 'ScientificApplication',
185
+ operatingSystem: 'Any',
186
+ },
187
+ {
188
+ '@context': 'https://schema.org',
189
+ '@type': 'FAQPage',
190
+ mainEntity: faq.map((item) => ({
191
+ '@type': 'Question',
192
+ name: item.question,
193
+ acceptedAnswer: {
194
+ '@type': 'Answer',
195
+ text: item.answer,
196
+ },
197
+ })),
198
+ },
199
+ {
200
+ '@context': 'https://schema.org',
201
+ '@type': 'HowTo',
202
+ name: title,
203
+ step: howTo.map((step) => ({
204
+ '@type': 'HowToStep',
205
+ name: step.name,
206
+ text: step.text,
207
+ })),
208
+ },
209
+ ],
210
+ };
@@ -0,0 +1,11 @@
1
+ import { entropySecondLaw } from './entry';
2
+ import type { ToolDefinition } from '../../types';
3
+
4
+ export * from './entry';
5
+
6
+ export const ENTROPY_SECOND_LAW_TOOL: ToolDefinition = {
7
+ entry: entropySecondLaw,
8
+ Component: () => import('./component.astro'),
9
+ SEOComponent: () => import('./seo.astro'),
10
+ BibliographyComponent: () => import('./bibliography.astro'),
11
+ };
@@ -0,0 +1,208 @@
1
+ export interface ChamberConfig {
2
+ count: number;
3
+ temperature: number;
4
+ }
5
+
6
+ export interface ParticleState {
7
+ id: number;
8
+ x: number;
9
+ y: number;
10
+ vx: number;
11
+ vy: number;
12
+ energy: number;
13
+ chamberBias: 'left' | 'right';
14
+ }
15
+
16
+ export interface SimulationOptions {
17
+ width: number;
18
+ height: number;
19
+ left: ChamberConfig;
20
+ right: ChamberConfig;
21
+ gateOpen: number;
22
+ seed?: number;
23
+ }
24
+
25
+ export interface FrameMetrics {
26
+ spatialEntropy: number;
27
+ thermalEntropy: number;
28
+ totalEntropy: number;
29
+ leftCount: number;
30
+ rightCount: number;
31
+ leftAverageEnergy: number;
32
+ rightAverageEnergy: number;
33
+ }
34
+
35
+ interface StepContext {
36
+ dt: number;
37
+ divider: number;
38
+ gateTop: number;
39
+ gateBottom: number;
40
+ }
41
+
42
+ function seededRandom(seed: number): () => number {
43
+ let state = seed >>> 0;
44
+
45
+ return () => {
46
+ state = (state * 1664525 + 1013904223) >>> 0;
47
+ return state / 4294967296;
48
+ };
49
+ }
50
+
51
+ function clamp(value: number, min: number, max: number): number {
52
+ return Math.min(max, Math.max(min, value));
53
+ }
54
+
55
+ function temperatureToSpeed(temperature: number): number {
56
+ return 0.55 + (temperature / 100) * 2.6;
57
+ }
58
+
59
+ function normalizeTemperature(temperature: number): number {
60
+ return clamp(temperature / 100, 0, 1);
61
+ }
62
+
63
+ function bounceWithinBounds(particle: ParticleState, width: number, height: number) {
64
+ if (particle.x < 8 || particle.x > width - 8) {
65
+ particle.vx *= -1;
66
+ particle.x = clamp(particle.x, 8, width - 8);
67
+ }
68
+
69
+ if (particle.y < 8 || particle.y > height - 8) {
70
+ particle.vy *= -1;
71
+ particle.y = clamp(particle.y, 8, height - 8);
72
+ }
73
+ }
74
+
75
+ function bounceOffDivider(particle: ParticleState, divider: number, gateTop: number, gateBottom: number) {
76
+ const crossesDivider = particle.x > divider - 7 && particle.x < divider + 7;
77
+ const insideGate = particle.y > gateTop && particle.y < gateBottom;
78
+
79
+ if (crossesDivider && !insideGate) {
80
+ particle.vx *= -1;
81
+ particle.x = particle.x < divider ? divider - 8 : divider + 8;
82
+ }
83
+
84
+ return insideGate;
85
+ }
86
+
87
+ function applyTemperatureDrift(particle: ParticleState, leftTemperature: number, rightTemperature: number, divider: number) {
88
+ const speed = Math.hypot(particle.vx, particle.vy) || 1;
89
+ const drift = particle.x < divider
90
+ ? temperatureToSpeed(leftTemperature)
91
+ : temperatureToSpeed(rightTemperature);
92
+ const adjustment = (drift - speed) * 0.015;
93
+
94
+ particle.vx += (particle.vx / speed) * adjustment;
95
+ particle.vy += (particle.vy / speed) * adjustment;
96
+ }
97
+
98
+ function blendParticleEnergy(particle: ParticleState, divider: number, leftTemperature: number, rightTemperature: number) {
99
+ if (Math.abs(particle.x - divider) >= 14) return;
100
+
101
+ const oppositeTemperature = particle.x < divider ? rightTemperature : leftTemperature;
102
+ const nextEnergy = (particle.energy * 4 + normalizeTemperature(oppositeTemperature)) / 5;
103
+ particle.energy = clamp(nextEnergy, 0.08, 1.18);
104
+ }
105
+
106
+ function stepParticle(particle: ParticleState, options: SimulationOptions, context: StepContext) {
107
+ particle.x += particle.vx * context.dt;
108
+ particle.y += particle.vy * context.dt;
109
+
110
+ bounceWithinBounds(particle, options.width, options.height);
111
+ const insideGate = bounceOffDivider(particle, context.divider, context.gateTop, context.gateBottom);
112
+
113
+ applyTemperatureDrift(particle, options.left.temperature, options.right.temperature, context.divider);
114
+
115
+ if (insideGate) {
116
+ blendParticleEnergy(particle, context.divider, options.left.temperature, options.right.temperature);
117
+ }
118
+ }
119
+
120
+ export function createParticles(options: SimulationOptions): ParticleState[] {
121
+ const random = seededRandom(options.seed ?? 12345);
122
+ const divider = options.width / 2;
123
+ const particles: ParticleState[] = [];
124
+ const total = options.left.count + options.right.count;
125
+
126
+ for (let index = 0; index < total; index += 1) {
127
+ const chamberBias = index < options.left.count ? 'left' : 'right';
128
+ const chamber = chamberBias === 'left' ? options.left : options.right;
129
+ const baseTemperature = normalizeTemperature(chamber.temperature);
130
+ const speed = temperatureToSpeed(chamber.temperature);
131
+ const angle = random() * Math.PI * 2;
132
+ const horizontalPadding = 16;
133
+ const verticalPadding = 16;
134
+ const minX = chamberBias === 'left' ? horizontalPadding : divider + horizontalPadding;
135
+ const maxX = chamberBias === 'left' ? divider - horizontalPadding : options.width - horizontalPadding;
136
+
137
+ particles.push({
138
+ id: index,
139
+ x: minX + random() * Math.max(20, maxX - minX),
140
+ y: verticalPadding + random() * Math.max(20, options.height - verticalPadding * 2),
141
+ vx: Math.cos(angle) * speed,
142
+ vy: Math.sin(angle) * speed,
143
+ energy: 0.2 + baseTemperature * 0.8 + random() * 0.18,
144
+ chamberBias,
145
+ });
146
+ }
147
+
148
+ return particles;
149
+ }
150
+
151
+ export function stepParticles(
152
+ particles: ParticleState[],
153
+ options: SimulationOptions,
154
+ deltaMs: number,
155
+ ): void {
156
+ const divider = options.width / 2;
157
+ const aperture = clamp(options.gateOpen, 0.08, 0.96) * options.height;
158
+ const gateTop = (options.height - aperture) / 2;
159
+ const gateBottom = gateTop + aperture;
160
+ const context = {
161
+ dt: Math.max(0.5, deltaMs / 16.67),
162
+ divider,
163
+ gateTop,
164
+ gateBottom,
165
+ };
166
+
167
+ particles.forEach((particle) => {
168
+ stepParticle(particle, options, context);
169
+ });
170
+ }
171
+
172
+ function shannonBinary(leftCount: number, rightCount: number): number {
173
+ const total = leftCount + rightCount;
174
+ if (total <= 0) return 0;
175
+
176
+ const probabilities = [leftCount / total, rightCount / total].filter((value) => value > 0);
177
+ const entropy = probabilities.reduce((sum, value) => sum - value * Math.log2(value), 0);
178
+
179
+ return clamp(entropy, 0, 1);
180
+ }
181
+
182
+ export function measureSystem(particles: ParticleState[], width: number, temperatures: { left: number; right: number }): FrameMetrics {
183
+ const divider = width / 2;
184
+ const leftParticles = particles.filter((particle) => particle.x < divider);
185
+ const rightParticles = particles.filter((particle) => particle.x >= divider);
186
+ const leftCount = leftParticles.length;
187
+ const rightCount = rightParticles.length;
188
+ const leftAverageEnergy = leftCount > 0
189
+ ? leftParticles.reduce((sum, particle) => sum + particle.energy, 0) / leftCount
190
+ : normalizeTemperature(temperatures.left);
191
+ const rightAverageEnergy = rightCount > 0
192
+ ? rightParticles.reduce((sum, particle) => sum + particle.energy, 0) / rightCount
193
+ : normalizeTemperature(temperatures.right);
194
+ const spatialEntropy = shannonBinary(leftCount, rightCount);
195
+ const thermalDifference = Math.abs(leftAverageEnergy - rightAverageEnergy);
196
+ const thermalEntropy = clamp(1 - thermalDifference / 1.18, 0, 1);
197
+ const totalEntropy = clamp(spatialEntropy * 0.58 + thermalEntropy * 0.42, 0, 1);
198
+
199
+ return {
200
+ spatialEntropy,
201
+ thermalEntropy,
202
+ totalEntropy,
203
+ leftCount,
204
+ rightCount,
205
+ leftAverageEnergy,
206
+ rightAverageEnergy,
207
+ };
208
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { entropySecondLaw } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await entropySecondLaw.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { phaseDiagramCriticalPoints } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await phaseDiagramCriticalPoints.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}