Редактирование: Двумерное уравнение теплопроводности + волновое уравнение
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 3: | Строка 3: | ||
Численное решение двумерного уравнения теплопроводности и двумерного волнового уравнения. | Численное решение двумерного уравнения теплопроводности и двумерного волнового уравнения. | ||
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/Heat_Wave_2D/Wave_Heat_2D_v2- | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/Heat_Wave_2D/Wave_Heat_2D_v2-0_release/Wave_Heat_2D.html |width=960 |height=765 |border=0 }} |
Строка 13: | Строка 13: | ||
− | Скачать [[Медиа:Wave_Heat_2D_v2- | + | Скачать [[Медиа:Wave_Heat_2D_v2-0_release.zip|Wave_Heat_2D_v2-0_release.zip]]. |
− | + | Текст программы на языке JavaScript (разработчики [[Цветков Денис]], [[Кривцов Антон]]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> | |
− | |||
Файл '''"Wave_Heat_2D.js"''' | Файл '''"Wave_Heat_2D.js"''' | ||
− | |||
window.addEventListener("load", main_equations, false); | window.addEventListener("load", main_equations, false); | ||
function main_equations() { | function main_equations() { | ||
// Предварительные установки | // Предварительные установки | ||
+ | |||
var canv = init_canvas(Wave_Heat_2D_canvas); | var canv = init_canvas(Wave_Heat_2D_canvas); | ||
Строка 36: | Строка 35: | ||
var fps = 15; // frames per second - количество кадров в секунду | var fps = 15; // frames per second - количество кадров в секунду | ||
var dt = 0.005 * t0; // шаг интегрирования по времени | var dt = 0.005 * t0; // шаг интегрирования по времени | ||
− | |||
var p0 = m0 / (a0 * a0 * a0); // единица плотности, кг/м3 | var p0 = m0 / (a0 * a0 * a0); // единица плотности, кг/м3 | ||
Строка 67: | Строка 65: | ||
var pause = false; | var pause = false; | ||
button_pause.onclick = function () {pause = !pause;}; | button_pause.onclick = function () {pause = !pause;}; | ||
− | button_clear.onclick = | + | button_clear.onclick = function () { |
− | + | for (var i = 0; i < Nx; i++) | |
− | + | for (var j = 0; j < Ny; j++) { | |
− | |||
− | |||
− | |||
− | for (var i = | ||
− | for (var j = | ||
T[i][j].u = 0; | T[i][j].u = 0; | ||
T[i][j].v = 0; | T[i][j].v = 0; | ||
− | |||
} | } | ||
− | + | draw(); | |
− | } | + | }; |
var koeff1; | var koeff1; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
function set_calc_func() { | function set_calc_func() { | ||
− | if ( | + | if (redio_heat.checked) { |
heat_equation = true; | heat_equation = true; | ||
slider_damping_power.disabled = true; | slider_damping_power.disabled = true; | ||
Строка 118: | Строка 90: | ||
var heat_equation; | var heat_equation; | ||
set_calc_func(); | set_calc_func(); | ||
− | + | redio_heat.onchange = set_calc_func; | |
− | + | redio_wave.onchange = set_calc_func; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
var damping_power = 0; | var damping_power = 0; | ||
Строка 140: | Строка 100: | ||
slider_damping_power.oninput = function() {damping_power = slider_damping_power.value}; | slider_damping_power.oninput = function() {damping_power = slider_damping_power.value}; | ||
− | + | // начальные условия - распределение Гаусса | |
− | + | var T = []; | |
− | + | for (var i = 0; i < Nx; i++) { | |
− | + | T[i] = []; | |
− | + | for (var j = 0; j < Ny; j++) { | |
− | + | T[i][j] = {}; | |
− | + | var x = i / (Nx - 1); | |
− | + | var y = j / (Ny - 1); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | var width = 0.05; | ||
+ | var power = 15; | ||
+ | var minus = 0; | ||
− | + | T[i][j].u = Math.exp(-Math.pow(x - 0.5, 2) / width) * Math.exp(-Math.pow(y - 0.5, 2) / width) * power - minus; | |
− | + | T[i][j].v = 0; | |
− | |||
− | T[i][ | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | T[ | ||
} | } | ||
} | } | ||
− | |||
− | // | + | // периодические граничные условия |
− | + | for (i = 1; i < Nx - 1; i++) { | |
− | for ( | + | T[i][0] = T[i][Ny - 2]; |
− | + | T[i][Ny - 1] = T[i][1]; | |
− | |||
− | |||
− | |||
} | } | ||
− | + | for (j = 0; j < Ny; j++) { | |
− | + | T[0][j] = T[Nx - 2][j]; | |
− | + | T[Nx - 1][j] = T[1][j]; | |
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | var color_N = | + | var color_N = 60; // цветов не больше, чем color_N, саму переменную color_N в расчетах лучше не использовать |
var colors = prepare_colors(color_N); | var colors = prepare_colors(color_N); | ||
var cell_pics = prepare_cell_pics(colors); | var cell_pics = prepare_cell_pics(colors); | ||
Строка 301: | Строка 147: | ||
else if (e.which == 2) T1 = 0; // при нажатии средней клавиши мыши клетка нагревается | else if (e.which == 2) T1 = 0; // при нажатии средней клавиши мыши клетка нагревается | ||
else if (e.which == 3) T1 = T_min * 0.3; // при нажатии правой клавиши мыши клетка остывает | else if (e.which == 3) T1 = T_min * 0.3; // при нажатии правой клавиши мыши клетка остывает | ||
− | else return | + | else return; |
var area = (e.which != 2); | var area = (e.which != 2); | ||
Строка 320: | Строка 166: | ||
// везде прибавляем 1 - из за периодических условий массив сдвинут на 1 | // везде прибавляем 1 - из за периодических условий массив сдвинут на 1 | ||
if (!area) { | if (!area) { | ||
− | + | T[i][j].u = T1; | |
− | + | draw_cell(i, j); | |
− | |||
− | |||
} | } | ||
else for (var shift_i = -3; shift_i <= 3; shift_i++) { | else for (var shift_i = -3; shift_i <= 3; shift_i++) { | ||
var ii; | var ii; | ||
− | if (i + shift_i < 1) | + | if (i + shift_i < 1) ii = i + shift_i + Nx - 2; |
− | + | else if (i + shift_i > Nx - 2) ii = i + shift_i - Nx + 2; | |
− | |||
− | |||
− | else if (i + shift_i > Nx - 2) | ||
− | |||
− | |||
− | |||
else ii = shift_i + i; | else ii = shift_i + i; | ||
for (var shift_j = -3; shift_j <= 3; shift_j++) { | for (var shift_j = -3; shift_j <= 3; shift_j++) { | ||
var jj; | var jj; | ||
− | if (j + shift_j < 1) | + | if (j + shift_j < 1) jj = j + shift_j + Ny - 2; |
− | + | else if (j + shift_j > Ny - 2) jj = j + shift_j - Ny + 2; | |
− | |||
− | |||
− | else if (j + shift_j > Ny - 2) | ||
− | |||
− | |||
− | |||
else jj = shift_j + j; | else jj = shift_j + j; | ||
− | |||
− | |||
var r = Math.abs(shift_i) + Math.abs(shift_j); | var r = Math.abs(shift_i) + Math.abs(shift_j); | ||
Строка 379: | Строка 209: | ||
for (var i = 1; i < Nx - 1; i++) { | for (var i = 1; i < Nx - 1; i++) { | ||
for (var j = 1; j < Ny - 1; j++) { | for (var j = 1; j < Ny - 1; j++) { | ||
− | |||
if (heat_equation) T[i][j].v = (T[i + 1][j].u + T[i][j + 1].u - 4 * T[i][j].u + T[i - 1][j].u + T[i][j - 1].u) * koeff1; | if (heat_equation) T[i][j].v = (T[i + 1][j].u + T[i][j + 1].u - 4 * T[i][j].u + T[i - 1][j].u + T[i][j - 1].u) * koeff1; | ||
else T[i][j].v += ((T[i + 1][j].u + T[i][j + 1].u - 4 * T[i][j].u + T[i - 1][j].u + T[i][j - 1].u) * koeff1 - T[i][j].v * damping_power) * dt; | else T[i][j].v += ((T[i + 1][j].u + T[i][j + 1].u - 4 * T[i][j].u + T[i - 1][j].u + T[i][j - 1].u) * koeff1 - T[i][j].v * damping_power) * dt; | ||
Строка 390: | Строка 219: | ||
} | } | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
} | } | ||
Строка 462: | Строка 286: | ||
} | } | ||
− | </ | + | </source> |
Файл '''"Wave_Heat_2D.html"''' | Файл '''"Wave_Heat_2D.html"''' | ||
− | |||
<!DOCTYPE html> | <!DOCTYPE html> | ||
<html> | <html> | ||
Строка 475: | Строка 298: | ||
<table align=center> | <table align=center> | ||
<tr> | <tr> | ||
− | <td><canvas id="Wave_Heat_2D_canvas" width=" | + | <td><canvas id="Wave_Heat_2D_canvas" width="700" height="700" style="border:1px solid #000000; border-radius:6px; margin-bottom: -5px"></canvas><br></td> |
<td style="font:bold 12px sans-serif; color:#003366; background-color: #bbbbdd; border-radius:10px; padding: 8px; padding-right: 12px; vertical-align:top"> | <td style="font:bold 12px sans-serif; color:#003366; background-color: #bbbbdd; border-radius:10px; padding: 8px; padding-right: 12px; vertical-align:top"> | ||
<div style="text-align: center; font: bold italic 20px Arial, 'Helvetica Neue', Helvetica, sans-serif;">Опции</div> | <div style="text-align: center; font: bold italic 20px Arial, 'Helvetica Neue', Helvetica, sans-serif;">Опции</div> | ||
<hr> | <hr> | ||
− | <input type="radio" id=" | + | <input type="radio" id="redio_heat" name="My_radio" checked /> Уравнение теплопроводности<br> |
− | <input type="radio" id=" | + | <input type="radio" id="redio_wave" name="My_radio" /> Волновое уравнение<br><br> |
<span id="damping_span">Сила затухания:</span><br><input type="range" id="slider_damping_power" style="width: 150px;"><br><br> | <span id="damping_span">Сила затухания:</span><br><input type="range" id="slider_damping_power" style="width: 150px;"><br><br> | ||
<input type="button" id="button_pause" value="Пауза/Старт"/><br> | <input type="button" id="button_pause" value="Пауза/Старт"/><br> | ||
<input type="button" id="button_clear" value="Очистить"/><br><br> | <input type="button" id="button_clear" value="Очистить"/><br><br> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</td> | </td> | ||
− | |||
</tr> | </tr> | ||
<tr><td colspan="2" style="font:italic bold 12px Georgia, sans-serif; color:#ffffff; background-color: #888888; border-radius:6px; padding: 8px;"> | <tr><td colspan="2" style="font:italic bold 12px Georgia, sans-serif; color:#ffffff; background-color: #888888; border-radius:6px; padding: 8px;"> | ||
Строка 512: | Строка 314: | ||
<a href="http://tm.spbstu.ru/%D0%90.%D0%9C._%D0%9A%D1%80%D0%B8%D0%B2%D1%86%D0%BE%D0%B2">Anton Krivtsov</a> | <a href="http://tm.spbstu.ru/%D0%90.%D0%9C._%D0%9A%D1%80%D0%B8%D0%B2%D1%86%D0%BE%D0%B2">Anton Krivtsov</a> | ||
© 2014 | © 2014 | ||
− | </td></tr> | + | </td><td></td></tr> |
</table> | </table> | ||
</body> | </body> | ||
</html> | </html> | ||
− | </ | + | </source> |
− | </ | + | </toggledisplay> |
− | |||
[[Category: Виртуальная лаборатория]] | [[Category: Виртуальная лаборатория]] |