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

StreamWriter Fil;

long finish = DateTime.Now.Ticks;//finishTime.Second;

MessageBox.Show("время = " + ((double)(finish - start) / 10000000 + "\n" + "Расчёт завершён \n").ToString());

/*вывод ответов*/

Fil = new StreamWriter("resultat.xml");

Fil.WriteLine(heder);

Fil.WriteLine("<Table ss:ExpandedColumnCount=\"{0}\" ss:ExpandedRowCount=\"{1}\" x:FullColumns=\"1\"   \nx:FullRows=\"1\" ss:DefaultRowHeight=\"15\">", T.GetLength(1),T.GetLength(0));

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

{

Fil.WriteLine( "<Row ss:AutoFitHeight=\"0\">\n");

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

{

Fil.Write("<Cell><Data ss:Type=\"Number\">");

string ss = string.Format("{0,9:f14}", T[i,j]);

ss=ss.Replace(',','.');

Fil.Write(ss);

Fil.WriteLine("</Data></Cell>");

}

Fil.WriteLine("</Row>\n");

}

Fil.WriteLine(footor);

Fil.Close();

}

//////////////////////////////////////////

public void reshSLAU(double[,] A,double[] B, int ti)

{

for (int i = 0; i < A.GetLength(0); i++) //выполнение прямого хода Метода Гауса

{

/*получение треугольной матрицы*/

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

{

double lokKaf = A[j, i] / A[i, i];  //определение коэффициента домножения

for (int k = 0; k < A.GetLength(0); k++) //отнимание строк

{

A[j, k] = A[j, k] - A[i, k] * lokKaf;

}

B[j] = B[j] - B[i] * lokKaf;

}

}

/*-------обратный ход метода Гауса---------*/

int ln = A.GetLength(0);  //размерность матрицы

//T[] = new double[ln]; //инициализация массива ответов

for (int i = ln - 1; i >= 0; i--)

{

double hh = B[i];// hh присваиваем ответ из массива сил

for (int j = 0; j < ln; j++)

hh = hh - T[ti,j] * A[i, j]; //вычетание элементов строки матрицы

T[ti,i] = hh / A[i, i];//hh  делим на коэффициент при иксу

}

}

Form2 f2;

Graphics gr;

private void button1_Click(object sender, EventArgs e)

{

f2 = new Form2();

gr = f2.panel1.CreateGraphics();

f2.Show();

DrawGraph(lel, int.Parse(TB_RD.Text), 1);

}

public void DrawGraph(double len, int ti, int sm)

{

double frid = len;

double stepX = (f2.panel1.Width-1) / frid;

double step = frid / T.GetLength(1);

double min = T[ti,0];

double max = T[ti, 0];

int i = 0;

while (i < T.GetLength(1))

{

//xx[i]=x0+i*step;

//yy[i]=Sin(x[i]);

if (T[ti,i] < min)

min = T[ti, i];

if (T[ti, i] > max)

max = T[ti, i];

i++;

}

double hg;

if (max - min >= 0.01)

hg = (f2.panel1.Height) / (max - min);

else

hg = 1;

f2.maxt.Text = max.ToString();

f2.mint.Text = min.ToString();

f2.minx.Text = "0";

f2.maxx.Text = len.ToString();

Pen p = new Pen(Brushes.SteelBlue);

//int x= Convert.ToInt32(Math.Ceiling(xx[0]*stepX));

//int y = Convert.ToInt32(Math.Ceiling(140 + yy[0] * hg));

int x = 0, y = 0;

double xx = 0;

//Image1.Canvas.MoveTo(xx,yy);

Point[] poi = new Point[T.GetLength(1)];

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

{

x = Convert.ToInt32(Math.Ceiling(xx * stepX + sm));

y = Convert.ToInt32(Math.Ceiling(f2.panel1.Height - sm - (T[ti,j] - min) * hg)); //f2.panel1.Height+50poi[j] = new Point(x, y);

xx += len / (T.GetLength(1) - 1);

//gr.DrawLine(p,

//Image1.Canvas.LineTo(xx, yy);

}

gr.DrawLines(p, poi);

}

private void button2_Click(object sender, EventArgs e)

{

f2 = new Form2();

gr = f2.panel1.CreateGraphics();

f2.Show();

for(int i=1;i<int.Parse(TB_Tl.Text);i++)

DrawGraph(lel, i, 1);

}

}

}

Вывод: Изучили основы моделирования физических и технических систем. В результате сравнения метода конечных разностей и конечных элементов, метод конечных элементов более точный и быстрый.