Исследование равновесия твердого тела

Кривошеин Денис

ТБ-21

Вариант – 1

Определить реакции опор твердого тела под действием заданных активных сил. При нахождении неизвестных сил сотавить уравнения равновесия и представить их в матричной форме. Решить систему линейных уравнений с помощью алгоритмической программы. Выполнить проверку путем составления и решения системы уравнений для новой системы координат.

Дано: Плита, закрепленная на шести стержнях, находится в равновесии под действием двух активных сил:  составляющей угол с осью x и лежащей в плоскости параллельной плоскости (z,x) и силы тяжести  Известны размеры  Сила F приложена в точке A.

Определить: усилия в стержнях  

Выполнить проверку.

Рис. 1 Схема заданных сил и закрепления плиты

                                         

 

Составим систему уравнения равновесия в осях (x,y,z):

Перенесем активные силы в правую часть уравнений, меняя при этом знак.

 

Представим систему уравнений равновесия в матричной форме

Обозначим матрицу в левой части системы

 

 

;

 

вектор-столбец в правой части системы

                                                             

;

и вектор-столбец неизвестных

 

Тогда система уравнений запишется в компактной форме

Решение системы сводится к отысканию вектор-столбца неизвестных реакций стержней Для определения реакций стержней воспользуемся методом Гаусса решения систем линейных уравнений методом исключения. Существуют стандартные программы решения системы линейных алгебраических уравнений методом Гаусса без нахождения обратной матрицы к матрице жесткости (SIMQ “Fortrun”). Используем аналогичную подпрограмму на языке C#. Текст кода, размещенного в отдельном классе, добавленном в проект, выглядит так:

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Равновесие_системы_сил

{

class ClassSIMQ

{

   double[] A, B;

 

   public void SIMQ(double[,] K, ref double[] P, int N, ref int KS)

   {

 

       A = new double[N * N + 1];

       B = new double[N + 1];

       int sd = 0;

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

       {

           B[i + 1] = P[i];

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

           {

               sd++;

               A[sd] = K[j, i];

           }

       }

       int JY, IT, J, IJ, IMAX = 0, I, I1, k, I2, IQS, IX, JX, IXJX, JJX, IXJ, NY, IB, IA, IC;

       double TOL = 0, BIGA = 0, SAVE;

       KS = 0;

      int JJ = -N;

       for (J = 1; J <= N; J++)

       {

           JY = J + 1;

           JJ = JJ + N + 1;

           BIGA = 0.0;

           IT = JJ - J;

           for (I = J; I <= N; I++)

           {

               IJ = IT + I;

               if (Math.Abs(BIGA) - Math.Abs(A[IJ]) < 0)

               {

                   BIGA = A[IJ];

                   IMAX = I;

               }

           }//30

           if (Math.Abs(BIGA) - TOL <= 0)

           {

               KS = 1;

               return;

           }

           I1 = J + N * (J - 2);

           IT = IMAX - J;

           for (k = J; k <= N; k++)

           {

               I1 = I1 + N;

               I2 = I1 + IT;

               SAVE = A[I1];

               A[I1] = A[I2];

               A[I2] = SAVE;

               A[I1] = A[I1] / BIGA;

           }//50

           SAVE = B[IMAX];

           B[IMAX] = B[J];

           B[J] = SAVE / BIGA;

           if ((J - N) == 0)

           {

               break;

           }

           IQS = N * (J - 1);

           for (IX = JY; IX <= N; IX++)

           {

               IXJ = IQS + IX;

               IT = J - IX;

               for (JX = JY; JX <= N; JX++)

               {

                   IXJX = N * (JX - 1) + IX;

                   JJX = IXJX + IT;

                   A[IXJX] = A[IXJX] - A[IXJ] * A[JJX];

               }

               B[IX] = B[IX] - B[J] * A[IXJ];

           }

       }//65

       NY = N - 1;

       IT = N * N;

       for (J = 1; J <= NY; J++)

       {

           IA = IT - J;

           IB = N - J;

           IC = N;

           for (k = 1; k <= J; k++)

           {

               B[IB] = B[IB] - A[IA] * B[IC];

               IA = IA - N;

               IC = IC - 1;

           }

       }//80

 

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

       {

           P[i] = B[i + 1];

       }

 

   }

 

}

}

 

При запуске проекта на выполнение и подстановке исходных данных результат расчетов появляется в нижней таблице:

Рис. 2 Форма проекта при запуске программы

Клиентский код формы:

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 Кривошеин_задание_2

{

public partial class Form1: Form

{

   double[,] MatrA;

   double[] MatrB;

 

   int i, j;

   int m = 6;

   string st;

   List<string> list_st = new List<string>();

   string[] St;

 

   public Form1()

   {

       InitializeComponent();

   }

 

   private void выходToolStripMenuItem_Click(object sender, EventArgs e)

   {

       Close();

   }

 

   private void сохранитьВФайлToolStripMenuItem_Click(object sender, EventArgs e)

   {

       // Сохранение в файл исходной матрицы

 

 

       MatrA = new double[m, m];

 

       for (i = 0; i < m; i++)

       {

           for (j = 0; j < m; j++)

               MatrA[i, j] = Convert.ToDouble(dataGridView3.Rows[i].Cells[j].Value);

 

       }

       if (saveFileDialog1.ShowDialog() == DialogResult.OK)

       {

           FileStream FS = saveFileDialog1.OpenFile() as FileStream;

           StreamWriter SR = new StreamWriter(FS);

 

           for (i = 0; i < m; i++)

           {

               st = null;

               for (j = 0; j < m; j++)

               {

                   st = st + MatrA[i, j].ToString() + " ";

               }

               SR.WriteLine(st);

           }

           SR.Close();

           FS.Close();

       }

 

   }

 

   private void считатьИзФайлаToolStripMenuItem_Click(object sender, EventArgs e)

   {

       // Считывание из файла исходной матрицы

       if (openFileDialog1.ShowDialog() == DialogResult.OK)

       {

           FileStream FS = openFileDialog1.OpenFile() as FileStream;

           StreamReader SR = new StreamReader(FS);

 

           dataGridView3.Rows.Clear();

 

           list_st.Clear();

           while (SR.Peek() > 0)

           {

               list_st.Add(SR.ReadLine());

               //dataGridView1

               dataGridView3.Rows.Add();

           }

           St = list_st.ToArray();

 

           MatrA = new double[m, m];

 

 

           for (i = 0; i < m; i++)

           {

 

               St[i] = St[i].Replace(".", ",");;

               //Разбиение строки St на подстроки aa

               string[] aa = St[i].Split(" \t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

 

 

               for (j = 0; j < m; j++)

               {

                   //Заполнение матрицы и таблицы

                   MatrA[i, j] = Convert.ToDouble(aa[j]);

                   dataGridView3.Rows[i].Cells[j].Value = MatrA[i, j];

               }

           }

 

           SR.Close();

           FS.Close();

       }

 

   }

 

   private void считатьИзФайлаToolStripMenuItem1_Click(object sender, EventArgs e)

   {

       // Считывание из файла вектор-столбца

       if (openFileDialog1.ShowDialog() == DialogResult.OK)

       {

           FileStream FS = openFileDialog1.OpenFile() as FileStream;

           StreamReader SR = new StreamReader(FS);

 

           dataGridView2.Rows.Clear();

 

           list_st.Clear();

           while (SR.Peek() > 0)

           {

               list_st.Add(SR.ReadLine());

               //dataGridView1

               dataGridView2.Rows.Add();

           }

           St = list_st.ToArray();

 

           MatrB = new double[m];

 

 

           for (i = 0; i < m; i++)

           {

 

               St[i] = St[i].Replace(".", ",");;

 

               //Заполнение матрицы и таблицы

               MatrB[i] = Convert.ToDouble(St[i]);

               dataGridView2.Rows[i].Cells[0].Value = MatrB[i];

           }

           SR.Close();

           FS.Close();

       }

 

   }

 

   private void сохранитьВФайлToolStripMenuItem1_Click(object sender, EventArgs e)

   {

       // Сохранение в файл вектор-столбца

 

 

       MatrB = new double[m];

 

       for (i = 0; i < m; i++)

       {

 

           MatrB[i] = Convert.ToDouble(dataGridView2.Rows[i].Cells[0].Value);

 

       }

       if (saveFileDialog1.ShowDialog() == DialogResult.OK)

       {

           FileStream FS = saveFileDialog1.OpenFile() as FileStream;

           StreamWriter SR = new StreamWriter(FS);

 

           for (i = 0; i < m; i++)

           {

               st = null;

 

               st = MatrB[i].ToString() + " ";

 

               SR.WriteLine(st);

           }

           SR.Close();

           FS.Close();

       }

 

   }

 

   private void вычислениеНеизвестныхToolStripMenuItem_Click(object sender, EventArgs e)

   {

       int KS = 0;

       double[] MB = new double[6];

       for (i = 0; i < m; i++)

       {

 

           MB[i] = MatrB[i];

 

       }

       ClassSIMQ S = new ClassSIMQ();

       S.SIMQ(MatrA, ref MB, m, ref KS);

       label1.Text = "Код ошибки равен " + KS.ToString();

       for (i = 0; i < m; i++)

       {

 

           //Заполнение таблицы S

 

           dataGridView1.Rows[0].Cells[i].Value = MB[i];

       }

 

   }

}

}

Для проверки правильности решения задачи перенесем систему координат в нижний ярус конструкции и составим новую систему уравнений в осях :

 

Перенесем активные силы в правую часть уравнений, меняя при этом знак.

Представим систему уравнений равновесия в матричной форме

 

 

 

Обозначим матрицу в левой части системы

 

 

;

 

вектор-столбец в правой части системы

                                                             

;

Результат вычислений представлен на форме:

Рис. 3 Форма проекта с проверкой

Есть отклонения в результатах расчетных усилий ,  , которые менее 0,2 % от усредненных значений искомых сил.

0

 

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: