Основы компьютерного моделирования физических и технических систем. Математическую модель указанной физической системы, страница 5

f2 = new Form2();

gr = f2.panel1.CreateGraphics();

f2.Show();

}

private void button3_Click(object sender, EventArgs e)

{

double[] kk = new double[nx + 1];

for (int i = 1; i < nt; i++)

{

Array.Copy(vX, i * (nx + 1)/*i * (nx + 1)*/, kk, 0, nx + 1);//{1,2,3,3,2,1};

DrawGraph(L, kk, 1);

}

}

}

}

Листинг программы Метод Конечных Элементов

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace thermalTask

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

double l_all, //общая длина стержня

l1, l2, l3, l4, //длины участков стержня

lel, //длина конечного элеменат

c1, c2, //удельные теплоёмкости материалов

ro1, ro2, //плотности материалов

lam1, lam2, //теплопроводность материала

A, //площаль поперечного сесения стержня

dT, //промежуток времени

Q, //внутренний приток тепла

q, //плотность теплового потока

h, //коэффициент конвекции

Ts; //температура окружающей среды

double t;

int kolEl; //количество конечных элементов

//double[,] ci;

double[,] T;

double[] F;

double[,]  B,

P,

K, // матрица теплопроводности

C; // матрица демпфирования,

double[,] ci = {{2.0,1.0},   //локальная матрица демпфирования

{1.0,2.0}};

public void matrNaConst(double[,] MatR, double cons) //умножение матрицы на константу

{

for (int i = 0; i < MatR.GetLength(0); i++)

for (int j = 0; j < MatR.GetLength(1); j++)

MatR[i, j] *= cons;

//return MatR;

}

public void priSummMatr(double[,] Matr, double[,] mSum, int LVindex) //присуммирование матриц

{

for(int i=LVindex;i<LVindex+mSum.GetLength(0);i++)

for (int j = LVindex; j < LVindex + mSum.GetLength(1); j++)

{

Matr[i, j] += mSum[i - LVindex, j - LVindex];

}

}

public double[,] summMatr(double[,] A, double mulToA, double[,] B, double mulToB) //суммирование матриц

{

double[,] Ret = new double[A.GetLength(0),A.GetLength(1)];

for (int i = 0; i < A.GetLength(0); i++)

for (int j = 0; j < A.GetLength(1); j++)

Ret[i, j] = mulToA*A[i, j] + mulToB*B[i, j];

return Ret;

}

public double[] summVector(double[] A, double mulToA, double[] B, double mulToB) //суммирование матриц

{

double[] Ret = new double[A.GetLength(0)];

for (int i = 0; i < A.GetLength(0); i++)

Ret[i] = mulToA * A[i] + mulToB * B[i];

return Ret;

}

public double[] multiMatr(double[,] A, double mulToA, double[] B, double mulToB) //умножение матрицы на векто

{

double[] Ret = new double[A.GetLength(0)];

for (int i = 0; i < A.GetLength(0); i++)

for (int j = 0; j < A.GetLength(1); j++)

Ret[i] += mulToA * A[i, j] * mulToB * B[j];

return Ret;

}

public double[] fi(double pQ, double pq, double ph,double pTs,double pT, double pL, double pA)

{

double[] f = new double[2];

for (int i = 0; i < 2; i++)

f[i] = (pQ * pA * pL - pq * pA + ph * pA * (pT-pTs)) * (-0.5);

return f;

}

private void BT_vitchislit_Click(object sender, EventArgs e)

{

long start = DateTime.Now.Ticks;

l1 = double.Parse(ED_L1.Text);

l2 = double.Parse(ED_L2.Text);

l3 = double.Parse(ED_L3.Text);

l4 = double.Parse(ED_L4.Text);

l_all = l1 + l2 + l3 + l4;

c1 = double.Parse(ED_C1.Text);

c2 = double.Parse(ED_C2.Text);

ro1 = double.Parse(ED_ro1.Text);

ro2 = double.Parse(ED_ro2.Text);

lam1 = double.Parse(ED_lam1.Text);

lam2 = double.Parse(ED_lam2.Text);

kolEl = int.Parse(ED_ke.Text);

lel = l_all / kolEl;

A=double.Parse(ED_A.Text);

dT = double.Parse(ED_dT.Text);

K = new double[kolEl + 1, kolEl + 1];

C = new double[kolEl + 1, kolEl + 1];

int tl = int.Parse(TB_Tl.Text);

double t0 = double.Parse(TB_NT.Text);

T= new double[tl+1,kolEl+1];

for (int i = 0; i < T.GetLength(1); i++)

T[0,i] = t0;

double ci_m1_kaf = (c1 * ro1 * A * lel) / 6;

double ci_m2_kaf = (c2 * ro2 * A * lel) / 6;