ИДЕАЛЬНЫЙ ГАЗ И ПОСТРОЕНИЕ ЗАВИСИМОСТИ КОЛИЧЕСТВА ЧАСТИЦ ОТ ВРЕМЕНИ

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск

Исполнитель: Васильева Анастасия

Группа 23604/1 Кафедра Теоретической механики

Формулировка задачи[править]

Цель данной курсовой работы – создать модель поведения идеального газа в двухмерном сосуде с открытым отверстием. Актуальность темы: Решение важных теоретических и прикладных задач механики сплошных сред практически невозможно без математического моделирования. Основной элемент решений которых строятся с помощью предложенного подхода.

Описание моделируемого процесса[править]

В данной курсовой работе мы рассмотрим идеальный газ — математическая модель газа, в которой предполагается, что потенциальной энергией молекул можно пренебречь по сравнению с их кинетической энергией. Между молекулами не действуют силы притяжения или отталкивания, соударения со стенками сосуда абсолютно упруги, а время взаимодействия между молекулами пренебрежимо мало по сравнению со средним временем между столкновениями. Понятие об идеальном газе является практически удобной абстракцией. Такое понятие дало возможность построить молекулярно-кинетическую теорию, рассмотреть вопросы о вычислении теплоемкостей, явления переноса и др. В определенных границах выводы этой теории хорошо подтверждаются экспериментами. Модель широко применяется для решения задач термодинамики газов и задач аэрогазодинамики. Например, воздух при атмосферном давлении и комнатной температуре с большой точностью описывается данной моделью. В случае экстремальных температур или давлений требуется применение более точной модели, например модели газа Ван-дер-Ваальса, в котором учитывается притяжение между молекулами. Данная модель описывает поведение частиц в двухмерном сосуде, а конкретно, показывает зависимость вылетания этих частиц через щель. Входными параметрами будут являться количество частиц и температура газа. Процесс движения идеального газа описывается уравнениями, задающими компоненты скоростей, подчиняющимся распределению Максвелла:

  while (massivx.length<n){ //задаем массив скоростей по X
           a=Math.random()*2; 
           b=Math.random()*2; 
           position = surface(a, b);    
            if((Math.exp(-(position.x*position.x)/(2*T))*(position.x*position.x))>position.y) 
            { 
                massivx.push(position.x); 
            } 
        }    
  while (massivy.length<n){ //задаем массив скоростей по Y
     a=Math.random()*2; 
     b=Math.random()*2; 
     position = surface(a, b); 
      if((Math.exp(-(position.x*position.x)/(*T))*(position.x*position.x))>position.y) 
       {  
        massivy.push(position.x);
        } 


Визуализация проекта[править]

Данная работа выполнена на JavaScript. Программа рисует сосуд, где жирной линией изображено отверстие. Ниже в окошке есть три поля для заполнения: первый показывает сколько частиц уже вылетело (числа появляются после запуска программы), другие два обязательны для ввода данных-количество частиц и температура. Также можно исследовать зависимость количества оставшихся частиц от времени, смотря на график.

Скачать отчет

Скачать курсовую работу архивом

<syntaxhighlight lang="cpp" line start="1" enclose="div">

<!DOCTYPE html> <html> <head> <title>Laboratory work of Canvas</title> <style>

  1. canvas {

display: block; margin: 0; border: 1px solid #000; } </style> <script type="text/javascript"> function graph() { var dps = []; var chart = new CanvasJS.Chart("chartContainer",{ title :{ text: "N(t)" }, data: [{ type: "line", dataPoints: dps }] }); var xVal = 0; var yVal = 0; var j=0; var updateInterval = 1000; var dataLength = 0; var updateChart = function(count) { count = count || 1; for(j = 0; j < count; j++) { yVal = n - counter; dps.push({ x: xVal, y: yVal }); xVal++; }; chart.render(); if (yVal==0){clearInterval(drawing);} }; updateChart(dataLength); vardrawing = setInterval(function(){updateChart()}, updateInterval); } </script> <script type="text/javascript" src="http://canvasjs.com/assets/script/canvasjs.min.js"></script> </head> <body>

<canvas id="canvas"></canvas> Pole: <input id="pole" value="0">
Enter number of parcticles: <input id="partcount" value="">
Enter temperature: <input id="temperature" value="">
<button onclick="counter=0; n=partcount.value; T=temperature.value; init(); graph();">Submit</button> <script> var W, H, ctx, n; var counter = 0; var massivx=[], massivy=[], a, b, T; var k=38*Math.pow(10, -23); var timer = 0; var Circle = function(x,y,radius, color, vx, vy){ this.x = x; this.y = y; this.r = radius; this.color = color; this.vx = vx; this.vy = vy; }; var circles = []; function surface(a, b) { return{ x: a*10, y: b*10 }; } function init(){ var canvas = document.getElementById("canvas"); canvas.width = window.screen.width/2; canvas.height = window.screen.height/2; ctx = canvas.getContext('2d'); var pole = document.getElementById("pole"); W = canvas.width; H = canvas.height; //задаем массив скоростей по X while(massivx.length<n){ a=Math.random()*2; b=Math.random()*2; position = surface(a, b); if ((Math.exp(-(position.x*position.x)/(2*T))*(position.x*position.x))>position.y) { massivx.push(position.x); } } //задаем массив скоростей по Y while (massivy.length<n){ a=Math.random()*2; b=Math.random()*2; position = surface(a, b); if ((Math.exp(-(position.x*position.x)/(2*T))*(position.x*position.x))>position.y) { massivy.push(position.x); } } for (var i=0;i<n;i++) { var randomRadius = Math.random()*200; var randomColor = 'rgb(' + Math.floor(0) + ','+ Math.floor(0) + ',0)'; var newCircle = new Circle(W/2-randomRadius, H/2-randomRadius, 4, randomColor, massivx[i], //скорость vx massivy[i] // скорость vy ); circles.push(newCircle); } setInterval("draw()", 1000/66); } function draw(){ // START draw() ctx.clearRect(0,0,W,H); for (var i=0;i<n;i++) // START FOR { var tempCircle = circles[i]; tempCircle.x += tempCircle.vx; tempCircle.y += tempCircle.vy; ctx.fillRect(W/8, H-3, W/2.75, H-3); if ((tempCircle.y+tempCircle.r) > H && (tempCircle.x+tempCircle.r) > (W/8) && (tempCircle.x+tempCircle.r) < (W/2)){ delete tempCircle.x delete tempCircle.y; delete tempCircle.r; delete tempCircle.color; delete tempCircle.vx; delete tempCircle.vy; counter++; pole.value=counter; } if ((tempCircle.y+tempCircle.r) > H || (tempCircle.y-tempCircle.r) < 0) { tempCircle.vy = -tempCircle.vy; } if ((tempCircle.x+tempCircle.r) > W || (tempCircle.x-tempCircle.r) < 0) { tempCircle.vx = -tempCircle.vx; } ctx.beginPath(); ctx.arc(tempCircle.x, tempCircle.y, tempCircle.r, 0, 2*Math.PI, false); ctx.fillStyle = tempCircle.color; ctx.fill(); } // END FOR } // END draw() </script> </body>

</html>