Помощь в написании студенческих работ
Антистрессовый сервис

Определение допускаемой изгибающей нагрузки воспринимаемой резьбовым соединением с резьбой Эдисона круглой

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

С целью получения наиболее точной аппроксимации формы границ, с них обычно и начинают разбиение области на элементы. После чего переходят к разбиению внутренних областей. Зачастую данный процесс удобно производить в несколько этапов. Сначала производят деление области на крупные подобласти, границы между которыми проходят там, где изменяются свойства материалов, геометрия, приложенная нагрузка… Читать ещё >

Определение допускаемой изгибающей нагрузки воспринимаемой резьбовым соединением с резьбой Эдисона круглой (реферат, курсовая, диплом, контрольная)

РАСЧЕТНО-ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту

Определение допускаемой изгибающей нагрузки воспринимаемой резьбовым соединением с резьбой Эдисона круглой

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

Область и возможности применения резьбовых соединений настолько обширны, что они нашли применение в различных сферах деятельности, таких как: машиностроение, авиастроение, кораблестроение, горнодобывающее дело, строительство высотных и невысотных зданий, мостов, железных дорог и т. д.

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

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

Множество аналитических теорий позволяют решать большое количество технических задач, связанных с исследованием напряженно-деформированного состояния твердых тел. Однако задачи со сложной геометрией не могут быть решены аналитически, поэтому для их решения используются численные методы, такие как МКР, МКЭ, ГКЭ. Они основаны на построении конечно-разносных сеток или разбиение конструкции на конечные элементы и получили распространение в различных областях: расчёты на прочность сложных инженерных сооружений, исследование теплопроводности различных материалов. Однако их использование является достаточно трудоёмким и сложным, поэтому распространение эти методы получили лишь с созданием и развитием ЭВМ, что позволило создавать автоматизированные систем.

Таким образом, задача данного курсового проекта заключается в выборе наиболее подходящего численного метода и разработке приложения позволяющего автоматизировать процесс решения поставленной задачи, а именно определения допускаемой изгибающей нагрузки воспринимаемой резьбовым соединением с резьбой Эдисона.

1. Основные подходы к математическому моделированию физических систем

1.1 Математическое моделирование

Математическая модель (ММ) представляет собой своеобразный «эквивалент» объекта, отражающий в математической форме важнейшие его свойства — законы которым он подчиняется, связи, присущие составляющим его частям.

Математическое моделирование — это процесс установления соответствия данному реальному объекту некоторого математического объекта, называемого математической моделью, и исследование этой модели, которое позволяет получать характеристики рассматриваемого реального объекта. Вид математической модели зависит от природы соответствующего реального объекта, требуемой достоверности и точности решения. 2].

Моделирование технических объектов возможно выполнить, в зависимости от степени детализации рассматриваемых процессов происходящих с объектом, на трёх уровнях: микро-, макрои метауровень. Рассмотрим более подробно микроуровень.

Математическая модель технического объекта на микроуровне представляет собой систему дифференциальных уравнений в частных производных или сокращённо ДУЧП, которая предоставляет описание процессов в сплошной среде вместе с совокупностью начальных и граничных условий (краевым условиям). Как правило, сама система уравнений известна, однако зачастую краевые условия не заданы в полной мере и в некоторых случаях могут являться конечной целью проекта.

В связи с тем, что ДУЧП, в большинстве случаев, не поддаются аналитическому решению, при моделировании используются численные методы решения. На нынешний момент наиболее часто используются методы конечных разностей (МКР), конечных элементов (МКЭ) и граничных элементов (МГЭ). Все эти методы основаны на дискретизации (замена непрерывных переменных конечным множеством их значений в заданных для исследования пространственном и временном интервалах) и алгебраизации (замена производных алгебраическими соотношениями) задачи моделирования.

На практике при решении ДУЧП применяют различные способы дискретизации и алгебраизации переменных.

1.2 Методика получения математических моделей элементов

В наиболее обобщенном случае можно выделить следующий алгоритм процедуры получения элементов математических моделей:

1. В первую очередь необходимо определить круг физических свойств объекта, которые подлежат рассмотрению при моделировании. Этот выбор зависит от предполагаемого предполагаемых воздействий при использование конечного продукта и степени универсальности математической модели.

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

3. Синтез структуры ММ.

Структура ММ — представляет собой обобщенный вид математических соотношений модели без конкретизации числовых значений фигурировавших в них параметров. Она также может представляться в графической форме, например в виде эквивалентных схем или графов.

Синтез структуры — является наиболее ответственной, поддающейся с наибольшим трудом формализации операцией.

4. Вычисление числовых значений параметров ММ. Данная задача выставляется как задача минимизации погрешностей модели заданной структуры.

5. Оценка точности и адекватности ММ.

1.3 Численные методы расчета

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

В целях облегчения получения решений, прибегают к использованию ЭВМ. Однако использование вычислительной техники приводит к некоторым трудностям. В первую очередь необходимо задачу преобразовать к алгебраическому виду. Во вторых необходимо минимизировать использование таких арифметических операций как деление, вычисление синусов и косинусов углов, которые в силу специфики производимых операций создают дополнительные погрешности при вычислениях. Для достижения этой цели выполняют замену непрерывной задачи на дискретную.

Одним из простейших видов дискретизации является переход к использованию метода конечных разностей (МКР). Он заключается в разбиение области решения конечно-элементной сеткой и замене непрерывного множества точек дискретное (Пример разбиения предоставлен на рисунке 1.3.1 (а)). С целью упрощения решения задачи можно использовать сетку с постоянным шагом.

При построении сетки рекомендовано использовать алгоритм содержит следующие этапы:

1. Построение сетки в заданной области, при этом в узлах определяется приближенные значения функции, а сеточная функция предоставляет набор узлов.

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

3. Решение полученной системы алгебраических уравнений с помощью выбранных численных методов.

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

Одним из наиболее широко применяемых видов дискретизации является метод конечных элементов (МКЭ). Данный метод уже широко распространён и применяется в различных областях. Разбиение предоставлено на рисунке 1.3.1 (б).

Решение задач по МКЭ содержит следующие этапы:

1. Разбиение заданной области на конечные элементы. Нумерация узлов и элементов.

2. Построение матриц жесткости конечных элементов.

3. Сведение нагрузок и воздействий, приложенных к конечным элементам, к узловым силам.

4. Формирование общей системы уравнений; учет в ней граничных и начальных условий. Решение полученной системы уравнений.

5. Определение напряжений и деформаций в конечных элементах.

Преимуществами метода конечных элементов являются:

1. Свойства материалов смежных элементов не должны быть обязательно одинаковыми. Это позволяет применять метод к телам, составленным из нескольких материалов.

2. Криволинейная область может быть аппроксимирована с помощью прямолинейных элементов или описана точно с помощью криволинейных элементов.

3. Размеры элементов могут быть переменными. Это позволяет укрупнить или измельчить сеть разбиения области на элементы, если в этом есть необходимость.

4. С помощью метода конечных элементов не представляет труда рассмотрение граничных условий с разрывной поверхностной нагрузкой, а также смешанных граничных условий.

Недостатком МКЭ является необходимость дискретизации всего тела, что приводит к большому количеству конечных элементов, тем самым увеличивая сложность вычислений. Кроме того, МКЭ иногда приводит к разрывам значений исследуемых величин, поскольку процедура метода налагает условия неразрывности лишь в узлах.

Также можно использовать ещё один численный метод — метод граничных элементов (МГЭ). Его работа заключатся в рассмотрении системы уравнений включающей в себя только значения в узлах находящихся на границах области. Таким образом, схема дискретизации требует разбиения лишь поверхности тела, она делится на ряд элементов и считается, что нужно найти приближённое решение, которое аппроксимирует исходную краевую задачу. Полученные элементы получили название граничных элементов. При использовании данного метода дискретизация повлечёт к решению меньшей системы уравнений. Однако он имеет и свой недостаток. А именно то, что вывод граничных интегральных уравнений и их решение может оказаться более сложными в математической части, по сравнению с остальными численные методами. Это обусловлено тем что, методы граничных интегральных уравнений развивались только математиками, но с течением времени их развитие стало более обширно. Теперь также доступны методы граничных элементов, по сути развившихся на основе идей интегральных уравнений. Они достаточно широко применимы без использования доказательств существования и единственности для каждого отдельного решения. В настоящее время эти методы становятся всё более и более популярными и особенно часто реализуются в алгоритмах для быстродействующих компьютерных систем.

Рисунок 1.3.1 — Разбиение тел неправильной формы сеткой конечных разностей (а) и сеткой конечных элементов (б) Так как задачей курсового проектирования является рассмотрение нагрузок крепежного соединения болта и гайки, был выбран для реализации метод конечных элементов. Это связанно с тем, что элементы имеют неправильную форму в самой резьбе, а МКЭ, как показано на рисунке 1.3.1 метод конечных элементов в большей степени аппроксимирует форму тела, а значит и при решении задачи даёт меньшую погрешность.

1.4 Общее понятие о методе конечных элементов

Метод конечных элементов заключается в разбиении математической модели конструкции некоторые конечные элементы. Они могут быть одномерными, двумерными и многомерными (Пример конечных элементов предоставлен на рисунке 1.4.1). Выбираемый тип элемента зависит от исходных данных и требуемой точности расчётов. Таким образом, получаем множество элементов, разбивающих конструкцию на своеобразную сетку, которую принято называть — конечно-элементной.

При работе с МКЭ можно выделить в общем случае несколько общих этапов:

1. Разбиение области на конечные элементы:

С целью получения наиболее точной аппроксимации формы границ, с них обычно и начинают разбиение области на элементы. После чего переходят к разбиению внутренних областей. Зачастую данный процесс удобно производить в несколько этапов. Сначала производят деление области на крупные подобласти, границы между которыми проходят там, где изменяются свойства материалов, геометрия, приложенная нагрузка. После чего каждая из них разбивается на элементы в зависимости от особенностей и требуемой точности. Затем осуществляется нумерация узлов конечных элементов. Этот процесс являлся бы тривиальной задачей, если бы не влиял на эффективность последующих вычислений. Если рассмотреть полученную в результате систему линейных уравнений, то можно выделить своеобразную полосу прокрутки. Она представляет собой некоторую область, заключающую ненулевые элементы в матрице коэффициентов между двумя линиями, расстояние между ними называется шириной полосы матрицы (Пример ширины полосы предоставлен на рисунке 1.4.2). Так как чем больше ширина полосы прокрутки, тем больше число итераций необходимых для получения результата, нумерация узлов является очень важным процессом и может минимизировать в дальнейшем вычислительных процесс.

2. Определение аппроксимирующей функции для каждого элемента:

На этом этапе искомая непрерывная функция заменяется кусочно-непрерывной, определенной на множестве конечных элементов. Эту процедуру можно выполнить один раз для типичного элемента области и затем полученную функцию использовать для остальных элементов того же вида.

3. Объединение конечных элементов.

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

Рисунок 1.4.1 — Некоторые конечные элементы

3. Решение полученной системы алгебраических уравнений.

Реальная конструкция аппроксимируется многими сотнями конечных элементов, возникают системы уравнений со множеством неизвестных. В решении таких систем уравнений заключается основная проблема реализации метода конечных элементов. Выбираемый метод решения зависит от размера разрешающей системы уравнений. В связи с этим разработаны специальные способы хранения матрицы жесткости, позволяющие уменьшить необходимый для решения объем оперативной памяти ЭВМ.

Рисунок 1.4.2 Ширина полосы системы уравнений Для решения систем уравнений применяются различные численные методы, выбор между которыми зависит от вида полученной матрицы, это хорошо просматривается в том случае, когда матрица получается не симметричная, в этом случае невозможно использовать такие методы как метод сопряженных градиентов.

Вместо определяющих уравнений часто используют вариационный подход. Иногда ставится условие обеспечения малой разницы между приближенным и истинным решениями. Так как число неизвестных в окончательной системе уравнений велико, то используется матричное обозначение. В настоящее время существует достаточное количество численных методов решения системы уравнений, что облегчает получение результата.

2. Программная реализация задачи

2.1 Общая постановка задачи

При деформировании конструкционных материалов выделяется начальный и предельный случаи деформирования. Первый случай представляет собой стадию упругого деформирования, второй? стадию разрушения материала. С упругой стадии, как правило, начинаются все начальные процессы деформирования. Между этими крайними случаями материал претерпевает различные виды неупругих деформаций. Существование промежуточных стадий деформирования формирует широкие возможности применения материалов в различных областях техники, является одним из составляющих успеха, определяющего достижения технического прогресса.

Отражением механических свойств материалов является диаграмма напряжений материала, получаемая из испытаний образцов. Пример диаграммы предоставлен на рисунке 2.1.1.

Рисунок 2.1.1? Общий вид диаграммы напряжений (деформаций)

малоуглеродистой стали В рамках курсового проектирования мы будем получать стадии упругости и разрушения с помощью метода конечных элементов. На выходе программа должна будет показать, как ведет себя резьбовое соединение при заданной нагрузке с помощью визуальных средств, а так же численно показывать перемещение узлов при действии силы.

2.2 Математическая постановка задачи

Для решения поставленной задачи используем метод конечных элементов. Резьбовое соединение можно рассмотреть как тело вращение. Благодаря этому задачу можно представить как плоскую, рассмотрев только одно сечение. Пример предоставлен на рисунке 2.2.1. Получив результаты в данном сечении, можно применить его в любом другом.

Деталь разбивается на треугольные конечные элементы с узлами i, j, k представленные на рисунке 2.2.2

Перемещения каждого узла имеют две компоненты, формула (2.1):

(2.1)

шесть компонент перемещений узлов элемента образуют вектор перемещений {д}:

. (2.2)

Рисунок 2.1.1? Сечение болта как тело вращения

Перемещение любой точки внутри конечного элемента определяется соотношениями (2.3) и (2.4):

(2.3)

. (2.4)

При объединении (2.3) и (2.4) в одно уравнение получается следующее соотношение:

. (2.5)

Деформации и перемещения связаны между собой следующим образом:

. (2.6)

Рисунок 2.2.2 — Треугольный конечный элемент

При подстановке (2.5) в (2.6) получается соотношение (2.7):

. (2.7)

Соотношение (2.7) можно представить в виде:

(2.8)

где [В] - градиентная матрица вида (2.9):

(2.9)

где b-разница координат OY, c-разница координат OX.

Функции формы линейно зависят от координат x, y и следовательно, градиентная матрица не зависит от координат точки внутри конечного элемента, и деформации и напряжения внутри конечного элемента в этом случае постоянны.

При плоском деформированном состоянии в изотропном материале матрица упругих постоянных [D] определяется по формуле (2.10):

(2.10)

где Е — модуль упругости, — коэффициент Пуассона.

Локальная матрица жесткости конечного элемента имеет вид:

(2.11)

Так как интегрирование производится по площади треугольника и ни одна из матриц не содержит значений x или y, то имеют решения имеет простое выражение:

(2.12)

где — площадь элемента.

В нашем случае площадь для большей достоверности треугольника находилась через определитель координат вершин по следующей формуле:

(2.13)

Уравнение равновесия iого узла имеет вид:

(2.14)

Для учета условий закрепления существует следующий метод. Пусть имеется некоторая система N уравнений (2.15):

. (2.15)

В случае, когда одна из опор неподвижна, т. е. Ui=0, рассмотрим на примере, когда U2=0:

(2.16)

то есть соответствующие строка и столбец задаются нулевыми, а диагональный элемент — единичным. Соответственно, приравнивается нулю и F2.

Для решения полученной системы выбираем метод Гаусса.

2.3 Программная постановка задачи, реализованная на языке высокого уровня

Для написания программы был выбран объектно-ориентированный язык C#. Все задачи и алгоритм работы программы предоставлен на рисунке 2.3.1

Для решения конкретной задачи необходимо для начала задать начальные условия. Затем выбрать количество витков текущее, угол разбиения. Данный угол влияет на количество элементов, на которые будет разбито соединение. Чем больше он, тем меньше точность результатов, но быстродействие программы увеличится. При уменьшении угла аппроксимация на границах резьбы будет максимально точна, а, следовательно, результаты будут более точны, но быстродействие понизится из-за большего количества конечных элементов, на которые разбиты детали соединения. В результате программа покажет визуально деформацию и выведет максимальное смещение, в результате этого, можно будет сделать вывод о том, выдержала ли резьба приложенную силу. Как правило, резьба считается поврежденной, если смещение будет больше 10−15% от размера зуба резьбы, но в приложении можно самостоятельно задать критическое смещение.

Рисунок 2.3.1 Алгоритм работы программы Структура приложения, написанного с помощью объектно-ориентированного языка, представлена в таблице 2.3.1.

Таблица 2.3.1 — Структура разработанного приложения

Метод

Тип принимаемых значений

Возвращаемое значение

Описание

Global_Web ()

;

;

Основной алгоритм построения конечно-элементной сетки

Setka ()

Координаты точек, материал номер элемента

;

Метод разбиения

formMatrixQ ()

;

;

Формирование матрицы Q

formMatrixE ();

;

;

Формирование матрицы E

formMatrixA ()

Координаты точек

;

Формирование матрицы А

setGU ()

;

int[]

Возвращает в элементе глобальные номера узлов

Mat ()

;

Int

Возвращает материал элемента

X ()

;

double[]

Возвращает массив координат X

Y ()

;

double[]

Возвращает массив координат Y

Transposition ()

Матрица

double[]

Транспонирует матрицу

Summation ()

Две матрицы

double[,]

Суммирует две матрицы

Multiplication ()

Две матрицы

double[,]

Умножает две матрицы

setGU ()

;

int[]

Возвращает в элементе глобальные номера узлов

Mat ()

;

Int

Возвращает материал элемента

X ()

;

double[]

Возвращает массив координат X

Y ()

;

double[]

Возвращает массив координат Y

3. Верификация и проведение вычислительного эксперимента

3.1 Реализация модели конструкции в пакете ANSYS

математический программный моделирование численный

С целью проверки получаемых в ходе работы приложения результатов на достоверность была проведена верификация данных с помощью пакета ANSYS. Для этого было проведено моделирование резьбового соединения E21 ГОСТ 6042–83.

Исходные данные представлены в таблице 3.1.1.

Таблица 3.1.1 — Исходные данные программы

Материал

Модуль упругости, 1010Н/м2

Коэффициент Пуассона

Значение дейст-вующей силы, Н

Коли-чество витков

Болт

Гайка

Болт

Гайка

Болт

Гайка

Свинец

Серебро

1,6

7,6

0,44

0,37

1*108

Серебро

Серебро

7,6

0,37

3*108

Латунь

Сталь

9,8

0,35

0.25

5*108

На первом шаге моделирования построим исследуемую резьбу:

1. Создание точек:

Main Menu > Preprocessor > Modeling > Keypoints > In Active CS…

Рисунок 3.1.1 — Ввод модуля Юнга и коэффициента Пуассона

Соединение точек линиями:

Preprocessor > Modeling > Create > Lines > Lines > Straight Line…

2. Создание плоскости:

Preprocessor > Modeling > Create > Areas > Arbitrary > By Lines

3. Объединение:

Preprocessor > Modeling > Operate > Booleans > Add > Areas

4. Задание характеристик материала (рисунок 3.1.1):

Preprocessor > Material props > Materials Modes… > Structural > Linear > Elastic > Isotropic.

5. Построение конечно-элементной сетки с треугольными элементами (рисунок 3.1.2):

Preprocessor > Meshing > MeshTool

Рисунок 3.1.2 — Конечно-элементная сетка

6. закрепляем и нагружаем деталь в соответствии с заданием (рисунок 3.1.3):

Sulution > Define Loads > Apply > Structural > Displacement > On Lines

Sulution > Define Loads > Apply > Structural > Force/Moment > On Nodes

Рисунок 3.1.3 _ Нагрузка и закрепление детали

7. Расчет детали:

Sulution > Solve > Current LS

8. вывод результатов (приложение Г):

General Postproc > Plot Results > Deformed Shape

General Postproc > Plot Results > Contour Plot > Nodal Solu > DOF Solution…

General Postproc > List Results > Nodal Solution > DOF Solution…

Результат выполнения работы в ANSYS см. в приложении В.

3.2 Исследование полученных результатов

В результате проделанной работы разработано приложение, которое позволяет исследовать заданную деталь. Внешний вид программы приведен в приложении Г (рисунок Г.1). Cсравним результаты с решением аналогичной задачи в ANSYS. Процент расходимости результатов разработанной программы и ANSYS составил до 10%.

В таблице 3.2.1 приведены сравнительные данные.

Таблица 3.2.1 — Результаты выполнения программы

Значение действующей силы, Н

Максимальное перемещение, м

Решение в Ansys

Решение в С#

расхождение с решением, Ansys%

X

Y

X

Y

1*108

0.15770E-02

0.12269E-01

0.14823E-02

0.1153E-01

3*108

0.66400E-05

0.98894E-06

0.62391E-05

0.92994E-06

1*108

0.18487E-02

0.16232E-03

0.17993E-02

0.15429E-03

По приведённым в таблице 3.2.1 результатам заметно, что решение при малом количестве элементов имеет большую погрешность, но при увеличении количества конечных элементов погрешность заметно сокращается.

Из приведенных выше результатов видно, что погрешность действительно составляет до 10%. Из графического анализа результатов (приложения В, Г) видно, что погрешности соизмеримы во всех узлах.

Заключение

В данном курсовом проекте было создано приложение позволяющего оценить поведение резьбового соединения (с резьбой Эдисона) при воздействии изгибающей нагрузки. Вычислительная часть реализована с помощью метода конечных элементов, с конечными элементами, представляющими собой линейный треугольный элемент. Данный выбор обусловлен относительной простотой вычислений и необходимостью производить максимально-точную аппроксимацию границ изделия. А конечный элемент позволяет более точно построить разбиение на сетку в круглых областях резьбы. В качестве исходных данных программа принимает характеристики материалов и приложенную силу и определяет допустимость нагрузки по средствам анализа максимального отклонения точек по отношению к первоначальному положению.

В целях обеспечения адекватности стабильности работы была протестирована и все результаты предоставлены и сопоставлены с работой в системе ANSYS, принятой в качестве стандарта используемого при решении подобных задач. Все данные приведены в главе «Верификация и проведение вычислительного эксперимента».

Таким образом, данную программу можно применять при расчётах допустимых изгибающих нагрузок в деталях использующих резьбу Эдисона.

Список использованных источников

1. Зенкевич О. Метод конечных элементов в технике. -М.: Мир, 1975. — 318 с.

2. Зенкевич О., Чанг И. Метод конечных элементов теории сооружений и в механике сплошных сред. — М.: Недра, 1974. — 240 с.

3. Сегерлинд Л. Применение метода конечных элементов. — М.:Мир, 1979. -392 с.

4. Википедия, свободная энциклопедия. Автор: Д. Уэйлс и Л. Сэнгер. http://ru.wikipedia.org

5. Самарский А. А.: Введение в численные методы. — М.:Мир, 1982. -269 с

Приложение

Исходный код программы на языке C#

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.Drawing.Drawing2D;

namespace KursachKSKER

{

public partial class Form1: Form

{

double G, //модуль Юнга

my; //коэффициент Пуассона

double maxX = 0;

double maxY = 0;

int KolUsel;

double[,] E;

double[,] AA;

double[,] BB;

double[,] Q;

int usel=43;

bool key = false;

double[,] K = {

{1,1,1,1,1,1},

{1,1,1,1,1,1},

{1,1,1,1,1,1},

{1,1,1,1,1,1},

{1,1,1,1,1,1},

{1,1,1,1,1,1}

};

double[,] gK;

public void formMatrixQ ()

{

Q = new double[3, 6];

Q[0, 1] = 1;

Q[1, 5] = 1;

Q[2, 2] = 1;

Q[2, 4] = 1;

}

public void formMatrixA (double x0, double y0, double x1, double y1, double x2, double y2)

{

AA = new double[6, 6];

AA[0, 0] = 1; AA[0, 1] = x0; AA[0, 2] = y0;

AA[1, 3] = 1; AA[1, 4] = x0; AA[1, 5] = y0;

AA[2, 0] = 1; AA[2, 1] = x1; AA[2, 2] = y1;

AA[3, 3] = 1; AA[3, 4] = x1; AA[3, 5] = y1;

AA[4, 0] = 1; AA[4, 1] = x2; AA[4, 2] = y2;

AA[5, 3] = 1; AA[5, 4] = x2; AA[5, 5] = y2;

}

public void formMatrixE ()

{

double kaf = G / (1 — my * my);

E = new double[3, 3];

E[0, 0] = kaf * 1;

E[0, 1] = kaf * my;

E[0, 2] = 0;

E[1, 0] = kaf * my;

E[1, 1] = kaf * 1;

E[1, 2] = 0;

E[2, 0] = 0;

E[2, 1] = 0;

E[2, 2] = kaf * (1 — my) / 2;

}

public double GetLenAB (double x0, double y0, double x1, double y1)

{

return Math. Sqrt (Math.Pow (x1 — x0, 2) + Math. Pow (y1 — y0, 2));

}

int t = 0;

Graphics pole;

KElement[] KG;

double ugol;

double A = 0, B = 0, R = 0;

double d, d1;//диаметры

double N;//кол-во витков

int pix;

int[] niz_numers1;

int[] niz_numers2;

int nom = 0;

int[] bok_numers1;

int[] bok_numers2;

int[] bok_numers3;

int[] bok_numers4;

int[] bok_numers5;

int[] bok_numers1L;

int[] bok_numers3L;

int[] bok_numers4L;

int nomer_treug = 0;

int koord=1;

int koordX = 350;

public Form1()

{

InitializeComponent ();

this.MouseWheel += new MouseEventHandler (wheel);

pole = panel1. CreateGraphics ();

}

private void wheel (object sender, MouseEventArgs e)

{

try

{

if (key)

{

numericUpDown4.Value += e. Delta / 20;

button1_Click (sender, new EventArgs ());

}

else

{

timer1.Stop ();

koord = koord + e. Delta / 20;

timer1.Start ();

}

}

catch (Exception) { }

}

private void button1_Click (object sender, EventArgs e)

{

d = double. Parse (textBox9.Text.ToString ());

d1 = double. Parse (textBox10.Text.ToString ());

N= (double)numericUpDown3.Value*2;

pix = (int)numericUpDown4.Value;

ugol = Convert. ToDouble (textBox1.Text);

B = d+d1*2;

R = (d — d1)/4;

A = N * R;

Global_Web ();

t = 1;

panel1.Refresh ();

}

public void Global_Web ()

{

int kol = (int)(360 / ugol);

niz_numers1 = new int[kol / 4 + 1];

niz_numers2 = new int[kol / 4 + 1];

bok_numers1 = new int[kol / 4 + 1];

bok_numers2 = new int[kol / 4 + 1];

bok_numers3 = new int[kol / 4 + 1];

bok_numers4 = new int[kol / 4 + 1];

bok_numers5 = new int[kol / 4 + 1];

bok_numers4L = new int[kol / 4 + 1];

bok_numers3L = new int[kol / 4 + 1];

bok_numers1L = new int[kol / 4 + 1];

//c_rig_numers = new int[5];

int dl = kol / 4 + 1;

int nomerUzla = 0;

nomer_treug = 0;

KG = new KElement[50 000];

double Rx=R, Ry=R;

double dr = d1 + d — R;

setka (Rx, d1 + Ry, 1, ref nomerUzla, ref nomer_treug, 1);

Array.Reverse (bok_numers1);

Array.Reverse (niz_numers1);

Array.Copy (bok_numers4, bok_numers4L, dl);

Array.Copy (bok_numers3, bok_numers3L, dl);

Array.Copy (bok_numers1, bok_numers1L, dl);

setka (Rx, dr, 3, ref nomerUzla, ref nomer_treug, 2);

Array.Reverse (bok_numers2);

Rx = Rx + R * 2;

int m = 2;

int n=1;

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

{

setka (Rx, d1 + Ry, 2, ref nomerUzla, ref nomer_treug, m);

Array.Reverse (niz_numers1);

Array.Copy (bok_numers2, bok_numers1L, dl);

Array.Copy (bok_numers5, bok_numers4L, dl);

setka (Rx, dr, 4, ref nomerUzla, ref nomer_treug, n);

Array.Reverse (bok_numers2);

Array.Reverse (bok_numers1);//верх

Array.Copy (bok_numers4, bok_numers4L, dl);

Array.Copy (bok_numers3, bok_numers3L, dl);

Array.Copy (bok_numers1, bok_numers1L, dl);

if (i% 2 == 0)

{ m = 2; n = 1; }

else

{ m = 1; n = 2; }

Rx = Rx + R * 2;

}

KolUsel = nomerUzla;

}

private void setka (double x0, double y0, int zona, ref int n, ref int nomer_treug, int material)

{

int n_spec = 0;

int nx_xspec = 0;

int doopX = 0, doopY = 0;

int Num_nach = n+1;

int n0 = n;

n++;

double r = R;

double cr = x0;

double r1 = R/2;

int kol = (int)(360 / ugol);

int foorMid = 0;

int ii1 = 0; int ii2 = 0;

int jj1 = 0; int jj2 = 0;

int li = 0;

int ni = 0;

int bok1 = 0;

int bok2 = 0;

int bok3 = 0;

int bok4 = 0;

int bok5 = 0;

int niz1 = 0;

int bok4L = 0;

int bok1L = 0;

int bok3L = 0;

int nomer1 = Num_nach + kol * 3;

int nomer2 = nomer1 + 20;

for (double fi = 315; fi < 675; fi = fi + ugol)

{

double x1, y1, x2, y2, x3, y3, x4, y4;

double tfi = fi + ugol;

double tr = r1 + R/2;

x1 = r1 * Cos (fi) +x0;

y1 = r1 * Sin (fi) + y0;

x2 = r1 * Cos (tfi) + x0;

y2 = r1 * Sin (tfi) + y0;

x3 = tr * Cos (fi) + x0;

y3 = tr * Sin (fi) + y0;

x4 = tr * Cos (tfi) + x0;

y4 = tr * Sin (tfi) + y0;

int[] Numer0 = new int[3];

int[] Numer = new int[3];

int[] Numer1 = new int[3];

double x5=0, x6=0, y5=0, y6=0;

if (fi < 495 && fi >= 405)

{

foorMid++;

y6 = y5 = r;

double Ntrad = Math. Abs (y5 / Sin (fi));

x5 = Math. Abs (Ntrad * Cos (fi) + x0);

Ntrad = Math. Abs (y6 / Sin (tfi));

x6 = Ntrad * Cos (tfi) + x0;

y5 = y6 = y5 + y0;

int nn = n;

if (x3≠ x5 && y3≠ y5)

{

n = n + 2;

}

else

n = n + 1;

int n1 = n + 5;

int nn1 = n1;

if (x4≠ x6 && y4≠ y6)

{

n1 = n1 + 2;

}

else

n1++;

if (x6 == x0 — R && (zona == 2 || zona == 4))

{

n1 = n1 — 1;

}

Numer0[0] = n0; Numer0[1] = nn1; Numer0[2] = nn;

Numer[0] = nn; Numer[1] = nn1; Numer[2] = nn1 + 1;

Numer1[0] = nn; Numer1[1] = nn1 + 1; Numer1[2] = nn + 1;

KG[nomer_treug] = new KElement (cr, y0, x2, y2, x1, y1, Numer0, material);

nomer_treug++;

KG[nomer_treug] = new KElement (x1, y1, x2, y2, x4, y4, Numer, material);

nomer_treug++;

KG[nomer_treug] = new KElement (x1, y1, x4, y4, x3, y3, Numer1, material);

nomer_treug++;

int m = 0;

if (zona == 1 || zona == 2)

m = 1;

else

m = 2;

if (x4≠ x6 && y4≠ y6)

{

Numer[0] = nn + 1; Numer[1] = nn1 + 1; Numer[2] = nn1 + 2;

if (x6 == x0 — R && (zona == 2 || zona == 4))

{

Numer[2] = bok_numers4L[0];

}

KG[nomer_treug] = new KElement (x3, y3, x4, y4, x6, y6, Numer, m);

nomer_treug++;

}

if (x3≠ x5 && y3≠ y5)

{

Numer1[0] = nn + 1; Numer1[1] = n1; Numer1[2] = nn + 2;

if (x6 == x0 — R && (zona == 2 || zona == 4))

{

Numer1[1] = bok_numers4L[0];

}

KG[nomer_treug] = new KElement (x3, y3, x6, y6, x5, y5, Numer1, m);

nomer_treug++;

}

double xx, yy;

xx = x6;

double h = d1 / 4;

int kol_poY = 4;

doopY = kol_poY;

int t = 0;

for (double tyy = 1; tyy < 5; tyy = tyy + 1)

{

yy = y5 + h;

Numer[0] = n; Numer[1] = n1; Numer[2] = n1 + 1;

Numer1[0] = n; Numer1[1] = n1 + 1; Numer1[2] = n + 1;

if (x6 == x0 — R && (zona == 2 || zona == 4))

{

Numer[0] = n; Numer[1] = bok_numers4L[bok4L]; Numer[2] = bok_numers4L[bok4L + 1];

Numer1[0] = n; Numer1[1] = Numer[2]; Numer1[2] = n + 1;

bok4L++;

}

if ((zona == 1 || zona == 2) && foorMid == 1)

{

if (bok4 == 0)

{

bok_numers4[bok4] = Numer[0];

bok4++;

}

bok_numers4[bok4] = Numer1[2];

bok4++;

}

//низ

if ((zona == 3 || zona == 4) && foorMid == 1)

{

if (bok5 == 0)

{

bok_numers5[bok5] = Numer[0];

bok5++;

}

bok_numers5[bok5] = Numer1[2];

bok5++;

}

if (t == 3 && (zona == 1 || zona == 2))

{

if (niz1 == 0)

{

niz_numers1[niz1] = Numer1[2];

niz1++;

}

niz_numers1[niz1] = Numer1[1];

niz1++;

}

int mat = 0;

if (zona == 1 || zona == 2)

mat = 1;

else

mat = 2;

int[] gu = new int[3];

KG[nomer_treug] = new KElement (x5, y5, x6, y6, xx, yy, Numer, mat);

if (t == 3&&(zona==3||zona==4))

{

gu[0] = 0; gu[1] = 0; gu[2] = 1;

KG[nomer_treug]. setGU (gu);

}

nomer_treug++;

KG[nomer_treug] = new KElement (x5, y5, xx, yy, x5, yy, Numer1, mat);

if (t == 3 && (zona == 3 || zona == 4))

{

gu[0] = 0; gu[1] = 1; gu[2] = 1;

KG[nomer_treug]. setGU (gu);

}

nomer_treug++;

y5 = y6 = yy;

n++;

n1++;

t++;

}

}

if (fi < 405 && fi >= 315)

{

x5 = x6 = r;

double Ntrad = Math. Abs (x5 / Cos (fi));

y5 = Math. Abs (Ntrad * Sin (fi) + y0);

Ntrad = Math. Abs (x6 / Cos (tfi));

y6 = Math. Abs (Ntrad * Sin (tfi) + y0);

x5 = x6 = x5 + x0;

int nn = 0;

int n1 = 0;

nn = n;

if (x3≠ x5 && y3≠ y5)

{

n = n + 2;;

}

else

n = n + 1;

if ((2 * d1 + 2 * R == y5) && (zona == 3 || zona == 4))

{

n—;

}

n1 = n + 1;

if (x4≠ x6 && y4≠ y6)

{

n1 = n1 + 2;

}

else

n1++;

Numer0[0] = n0; Numer0[1] = n + 1; Numer0[2] = nn;

Numer[0] = nn; Numer[1] = n + 1; Numer[2] = n + 2;

Numer1[0] = nn; Numer1[1] = n + 2; Numer1[2] = nn + 1;

KG[nomer_treug] = new KElement (cr, y0, x2, y2, x1, y1, Numer0, material);

nomer_treug++;

KG[nomer_treug] = new KElement (x1, y1, x2, y2, x4, y4, Numer, material);

nomer_treug++;

KG[nomer_treug] = new KElement (x1, y1, x4, y4, x3, y3, Numer1, material);

nomer_treug++;

int m = 0;

if (zona == 1 || zona == 2)

{

if (y6 > y0)

{

m = 1;

}

else

m =2;

}

if (zona == 3 || zona == 4)

{

if (y6 > y0)

{

m = 2;

}

else

m = 1;

}

if (x4≠ x6 && y4≠ y6)

{

Numer[0] = nn + 1; Numer[1] = n + 2; Numer[2] = n + 3;

KG[nomer_treug] = new KElement (x3, y3, x4, y4, x6, y6, Numer, m);

nomer_treug++;

}

if (x3≠ x5 && y3≠ y5)

{

Numer1[0] = nn + 1; Numer1[1] = n1; Numer1[2] = n;

if ((2 * d1 + 2 * R == y5) && (zona == 3 || zona == 4))

{

Numer1[2] = niz_numers1[niz_numers1.Length — 1];

}

KG[nomer_treug] = new KElement (x3, y3, x6, y6, x5, y5, Numer1, m);

nomer_treug++;

}

if (bok2 == 0 || bok1 == 0)

{

if (zona == 3 || zona == 4)

{

bok_numers2[bok2] = Numer1[2];

}

if (zona == 1 || zona == 2)

{

bok_numers1[bok1] = Numer1[2];

}

bok1++; bok2++;

}

if (x3 == x5 && y3 == y5)

{

Numer1[1] = Numer[2];

}

if (zona == 3||zona==4)

{

bok_numers2[bok2] = Numer1[1];

}

if (zona == 1||zona==2)

{

bok_numers1[bok1] = Numer1[1];

}

bok1++; bok2++;

}

if (fi < 585 && fi >= 495)

{

x5 = x6 = r;

double Ntrad = Math. Abs (x5 / Cos (fi));

y5 = Math. Abs (Ntrad * Sin (fi) + y0);

Ntrad = Math. Abs (x6 / Cos (tfi));

y6 = Ntrad * Sin (tfi) + y0;

x5 = x6 = x0 — x5;

int nn = n;

if (x3≠ x5 && y3≠ y5)

{

n = n + 2;;

}

else

n = n + 1;

if (y5 == d1 + 2 * R || y5 == 2 * d1 + 4 * R)

{

n = nn + 6;

if (zona == 2 || zona == 4)

{

n = nn + 2;

}

}

if (zona == 2 || zona == 4)

{

n = n — 1;

}

int n1 = n + 1;

if (x4≠ x6 && y4≠ y6)

{

n1 = n1 + 2;

}

else

n1++;

Numer0[0] = n0; Numer0[1] = n + 1; Numer0[2] = nn;

Numer[0] = nn; Numer[1] = n + 1; Numer[2] = n + 2;

Numer1[0] = nn; Numer1[1] = n + 2; Numer1[2] = nn + 1;

if (x4 == x6 && y4 == y6 && (zona == 2 || zona == 4))

{

Numer0[0] = n0; Numer0[1] = n + 1; Numer0[2] = nn;

Numer[0] = nn; Numer[1] = n + 1; Numer[2] = bok_numers1L[bok1L + 1];

Numer1[0] = nn; Numer1[1] = Numer[2]; Numer1[2] = nn + 1;

}

if (x3 == x5 && y3 == y5 && (zona == 2 || zona == 4))

{

Numer0[0] = n0; Numer0[1] = n + 1; Numer0[2] = nn;

Numer[0] = nn; Numer[1] = n + 1; Numer[2] = n + 2;

Numer1[0] = nn; Numer1[1] = Numer[2]; Numer1[2] = bok_numers1L[bok1L];

}

KG[nomer_treug] = new KElement (cr, y0, x2, y2, x1, y1, Numer0, material);

nomer_treug++;

KG[nomer_treug] = new KElement (x1, y1, x2, y2, x4, y4, Numer, material);

nomer_treug++;

KG[nomer_treug] = new KElement (x1, y1, x4, y4, x3, y3, Numer1, material);

nomer_treug++;

int m = 0;

if (zona == 1 || zona == 2)

{

if (y6 < y0)

{

m = 2;

}

else

m = 1;

}

if (zona == 3 || zona == 4)

{

if (y6 < y0)

{

m = 1;

}

else

m = 2;

}

if (x4≠ x6 && y4≠ y6)

{

Numer[0] = nn + 1; Numer[1] = n + 2; Numer[2] = n + 3;

if (zona == 2 || zona == 4)

{

// Numer[1] = bok_numers1L[bok1L + 1];

Numer[2] = bok_numers1L[bok1L + 1];

}

if (x3 == x5 && y3 == y5&&(zona==2||zona==4))

{

Numer[0] = bok_numers1L[bok1L];

}

if (zona == 3 && y6 == (2 * d1 + 2 * R))

Numer[2] = niz_numers1[0];

KG[nomer_treug] = new KElement (x3, y3, x4, y4, x6, y6, Numer, m);

nomer_treug++;

}

if (x3≠ x5 && y3≠ y5)

{

int nn1 = n;

if (y5 == d1 + 2 * R)

nn1 = nn + 2;

Numer1[0] = nn + 1; Numer1[1] = n1; Numer1[2] = nn1;

if (zona == 2 || zona == 4)

{

Numer1[1] = bok_numers1L[bok1L + 1];

Numer1[2] = bok_numers1L[bok1L];

}

if (zona == 3 && y5 == 2*d1 + 4 * R)

{

Numer1[2] = nn + 2;

}

if (zona == 3 && y6 == (2 * d1 + 2 * R))

Numer1[1] = niz_numers1[0];

KG[nomer_treug] = new KElement (x3, y3, x6, y6, x5, y5, Numer1, m);

nomer_treug++;

}

bok1L++;

//MessageBox.Show (nx_xspec.ToString ());

}

if (fi < 675 && fi >= 585)

{

y5 = y6 = r;

double Ntrad = Math. Abs (y5 / Sin (fi));

x5 = Math. Abs (Ntrad * Cos (fi) + x0);

Ntrad = Math. Abs (y6 / Sin (tfi));

x6 = Ntrad * Cos (tfi) + x0;

if (zona == 1 || zona == 2)

y5 = y6 = d1;

else

y5 = y6 = y0 — y5;

int nn = n;

if (x3≠ x5 && y3≠ y5)

{

n = n + 2;

}

else

n = n + 1;

if (zona == 3 || zona == 4)

n—;

int n1 = 0;

if (zona == 1 || zona == 2)

n1 = n + 5;

else n1 = n + 1;

int nn1 = n1;

if (x4≠ x6 && y4≠ y6)

{

n1 = n1 + 2;

}

else

n1++;

if (x5 == x0 — R && zona == 2)

{

nn1 = nn+2;

}

if (zona == 1 || zona == 2)

{

Numer0[0] = n0; Numer0[1] = nn1; Numer0[2] = nn;

Numer[0] = nn; Numer[1] = nn1; Numer[2] = nn1 + 1;

Numer1[0] = nn; Numer1[1] = nn1 + 1; Numer1[2] = nn + 1;

}

else

{

Numer0[0] = n0; Numer0[1] = n + 1; Numer0[2] = nn;

Numer[0] = nn; Numer[1] = n + 1; Numer[2] = n + 2;

Numer1[0] = nn; Numer1[1] = n + 2; Numer1[2] = nn + 1;

}

if (x4 == x6 && y4 == y6 && (zona == 3||zona==4))

{

Numer0[0] = n0; Numer0[1] = n + 1; Numer0[2] = nn;

Numer[0] = nn; Numer[1] = n + 1; Numer[2] = niz_numers1[jj1 + 1];

Numer1[0] = nn; Numer1[1] = Numer[2]; Numer1[2] = nn + 1;

}

if (x3 == x5 && y3 == y5 && (zona == 3 || zona == 4))

{

Numer0[0] = n0; Numer0[1] = n + 1; Numer0[2] = nn;

Numer[0] = nn; Numer[1] = n + 1; Numer[2] = n + 2;

Numer1[0] = nn; Numer1[1] = Numer[2]; Numer1[2] = niz_numers1[jj1];

}

if (x6 == x0 + R)

{

Numer0[0] = n0; Numer0[1] = n0 + 1; Numer0[2] = nn;

Numer[0] = nn; Numer[1] = n0 + 1; Numer[2] = n0 + 2;

Numer1[0] = nn; Numer1[1] = n0 + 2; Numer1[2] = nn + 1;

}

KG[nomer_treug] = new KElement (cr, y0, x2, y2, x1, y1, Numer0, material);

nomer_treug++;

KG[nomer_treug] = new KElement (x1, y1, x2, y2, x4, y4, Numer, material);

nomer_treug++;

KG[nomer_treug] = new KElement (x1, y1, x4, y4, x3, y3, Numer1, material);

nomer_treug++;

int m = 0;

if (zona == 1 || zona == 2)

{

m = 2;

}

else m = 1;

if (x4≠ x6 && y4≠ y6)

{

Numer[0] = nn + 1; Numer[1] = nn1 + 1; Numer[2] = nn1 + 2;

if (zona == 3 || zona == 4)

{

Numer[2] = niz_numers1[jj1 + 1];

}

if (x3 == x5 && y3 == y5&&(zona==3||zona==4))

{

Numer[0] = niz_numers1[jj1];

}

if (x6 == x0 + R && (zona == 1 || zona == 2))

{

Numer[0] = nn + 1; Numer[1] = n0 + 2; Numer[2] = n0 + 3;

}

if (x6 == x0 + R && (zona == 3 || zona == 4))

{

Numer[0] = nn + 1; Numer[1] = n0 + 2; Numer[2] = niz_numers1[niz_numers1.Length — 1];

}

KG[nomer_treug] = new KElement (x3, y3, x4, y4, x6, y6, Numer, m);

nomer_treug++;

}

if (x3≠ x5 && y3≠ y5)

{

Numer1[0] = nn + 1; Numer1[1] = n1; Numer1[2] = nn + 2;

if (x5 == x0 — R && zona == 2)

{

Numer1[1] = nn1 + 2;

Numer1[2] = bok_numers3L[0];

n = nn + 1;

n1 = nn1 + 2;

}

if (zona == 3 || zona == 4)

{

Numer1[2] = niz_numers1[jj1];

Numer1[1] = niz_numers1[jj1 + 1];

}

if (x6 == x0 + R && (zona == 1 || zona == 2))

{

Numer1[0] = nn + 1; Numer1[1] = n0 + 3; Numer1[2] = nn + 2;

n1 = n + 5;

}

if (x6 == x0 + R && (zona == 3 || zona == 4))

{

Numer1[0] = nn + 1; Numer1[1] = niz_numers1[niz_numers1.Length — 1];

Numer1[2] = niz_numers1[niz_numers1.Length — 2];

}

KG[nomer_treug] = new KElement (x3, y3, x6, y6, x5, y5, Numer1, m);

nomer_treug++;

}

jj1++;

if (zona == 1 || zona == 2)

{

double xx, yy;

xx = x6;

double h = d1 / 4;

int kol_poY = 4;

doopY = kol_poY;

int t = 0;

/*

if (x5 == x0 — R && zona == 2)

{

//n1 = n + 3;

//MessageBox.Show (n1.ToString ());

}*/

for (double tyy = 1; tyy < 5; tyy = tyy + 1)

{

yy = y5 — h;

Numer[0] = n; Numer[1] = n1; Numer[2] = n1 + 1;

Numer1[0] = n; Numer1[1] = n1 + 1; Numer1[2] = n + 1;

if (x5 == x0 — R && zona == 2)

{

Numer[0] = bok_numers3L[bok3L]; Numer[1] = n1; Numer[2] = n1 + 1;

Numer1[0] = bok_numers3L[bok3L]; Numer1[1] = Numer[2]; Numer1[2] = bok_numers3L[bok3L + 1];

bok3L++;

}

if ((x6 == (x0 + R))&&t==0)

{

Numer[1] = n0 + 3;

Numer[2] = n1;

Numer1[1] = n1;

n1—;

}

if ((zona == 1 || zona == 2) && xx == x0 + R)

{

if (bok3 == 0)

{

bok_numers3[bok3] = Numer[1];

bok3++;

}

bok_numers3[bok3] = Numer1[1];

bok3++;

}

KG[nomer_treug] = new KElement (x5, y5, x6, y6, xx, yy, Numer, 2);//гайка

int[] gu = new int[3];

if (t == 3)

{ gu[0] = 0; gu[1] = 0; gu[2] = 1; }

KG[nomer_treug]. setGU (gu);

nomer_treug++;

KG[nomer_treug] = new KElement (x5, y5, xx, yy, x5, yy, Numer1, 2);//гайка

if (t == 3)

{

gu[0] = 0; gu[1] = 1; gu[2] = 1;

}

KG[nomer_treug]. setGU (gu);

nomer_treug++;

y5 = y6 = yy;

n = n + 1;

n1 = n1 + 1;

t++;

}

if (x6 == (x0 + R))

{

n=n1;

}

if (x5 == x0 — R && zona == 2)

{

n = nn1−1;

}

}

}

n++;

}

}

public double Cos (double fi)

{

return Math. Round (Math.Cos (fi * (Math.PI / 180)), 2);

}

public double Sin (double fi)

{

return Math. Round (Math.Sin (fi * (Math.PI / 180)), 2);

}

private void paint (Graphics gr)

{

Image g = new Bitmap (panel1.Width, panel1. Height);

Graphics ob = Graphics. FromImage (g);

SetStyle (ControlStyles.OptimizedDoubleBuffer, true);

SolidBrush brush = new SolidBrush (Color.Azure);

Pen pen = new Pen (Color.Black, 1);

Pen p1 = new Pen (Color.Black, 2);

double det = R * 1.5;

// MessageBox. Show (nomer_treug.ToString ());

if (t == 1)

{

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

{

double[] x = KG[i]. X ();

double[] y = KG[i]. Y ();

ob.DrawLine (pen, (float)x[0] * pix, (float)y[0] * pix, (float)x[1] * pix, (float)y[1] * pix);

ob.DrawLine (pen, (float)x[1] * pix, (float)y[1] * pix, (float)x[2] * pix, (float)y[2] * pix);

ob.DrawLine (pen, (float)x[2] * pix, (float)y[2] * pix, (float)x[0] * pix, (float)y[0] * pix);

}

}

gr.DrawImage (g, 0, 0);

}

private void panel1_Paint (object sender, PaintEventArgs e)

{

Image g = new Bitmap (5000, 5000);

Graphics ob = Graphics. FromImage (g);

SetStyle (ControlStyles.OptimizedDoubleBuffer, true);

SolidBrush brush = new SolidBrush (Color.Azure);

Pen pen = new Pen (Color.Azure, 1);

Pen p1 = new Pen (Color.Black, 1);

double det = R * 1.5;

Font font = new Font («Times New Roman», 8, FontStyle. Regular);

// MessageBox. Show (nomer_treug.ToString ());

if (t == 1)

{

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

{

double[] x = KG[i]. X ();

double[] y = KG[i]. Y ();

int[] nom = KG[i]. N ();

int m = KG[i]. Mat ();

if (m == 1)

brush.Color = Color. Blue;

else

brush.Color = Color. Red;

PointF[] points = new PointF[3];

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

{

points[j]. X = (float)x[j] * pix;

points[j]. Y = (float)y[j] * pix;

}

ob.FillPolygon (brush, points);

ob.DrawPolygon (pen, points);

//ob.DrawString (nom[2]. ToString (), font, Brushes. Black, (float)x[2] * pix, (float)y[2] * pix);

// ob. DrawLine (pen, (float)x[0] * pix, (float)y[0] * pix, (float)x[1] * pix, (float)y[1] * pix);

//ob.DrawLine (pen, (float)x[1] * pix, (float)y[1] * pix, (float)x[2] * pix, (float)y[2] * pix);

//ob.DrawLine (pen, (float)x[2] * pix, (float)y[2] * pix, (float)x[0] * pix, (float)y[0] * pix);

}

}

if (t == 2)

{

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

{

double[] x = KG[i]. X ();

double[] y = KG[i]. Y ();

int[] nom = KG[i]. N ();

int m = KG[i]. Mat ();

if (m == 1)

brush.Color = Color. Blue;

else

brush.Color = Color. Red;

PointF[] points = new PointF[3];

int sum = 0;

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

{

points[j]. X = ((float)x[j] + (float)X[nom[j] * 2]) * pix;

points[j]. Y = ((float)y[j] + (float)X[nom[j] * 2 + 1]) * pix;

if (nom[j] == usel)

{

}

}

}

e.Graphics.DrawImage (g, koordX, koord);

}

private void button2_Click (object sender, EventArgs e)

{

koord = koord — (int)numericUpDown4.Value;

panel1.Refresh ();

}

double[] X;

private void button3_Click (object sender, EventArgs e)

{

formMatrixQ ();

gK = new double[KolUsel * 2, KolUsel * 2];

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

{

double[] x = new double[3]; // KG[i]. X ();

double[] y = new double[3]; //KG[i]. Y ();

Array.Copy (KG[i].X (), x, 3);

Array.Copy (KG[i]. Y (), y, 3);

formMatrixA (x[0], y[0], x[1], y[1], x[2], y[2]);

BB = matrixOperation. inverseMatrix (AA);

double[,] md = new double[3, 3];

md[0, 0] = 1; md[1, 0] = 1; md[2, 0] = 1;

md[0, 1] = x[0]; md[1, 1] = x[1]; md[2, 1] = x[2];

md[0, 2] = y[0]; md[1, 2] = y[1]; md[2,2]=y[2];

double sTrigl = 0.5 * Math. Abs (matrixOperation.det (md));//площадь

//MessageBox.Show (sTrigl.ToString ());

if (KG[i]. Mat () == 1)

{

G = double. Parse (textBox5.Text);//2e11

my = double. Parse (textBox4.Text);

}

if (KG[i]. Mat () == 2)

{

G = double. Parse (textBox2.Text);//2e5

my = double. Parse (textBox3.Text);

}

formMatrixE ();

K = matrixOperation. multiplication (matrixOperation.transposition (BB), matrixOperation. transposition (Q));

K = matrixOperation. multiplication (K, E);

K = matrixOperation. multiplication (K, Q);

K = matrixOperation. multiplication (K, BB);

K = matrixOperation. multiplication (K, sTrigl);

int[] Numer = KG[i]. N ();

for (int si = 0; si < 3; si++)

for (int sj = 0; sj < 3; sj++)

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

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

{

gK[Numer[si] * 2 + ki, Numer[sj] * 2 + kj] += K[si * 2 + ki, sj * 2 + kj];

}

}

double[] RR = new double[KolUsel * 2];

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

{

int[] gu = KG[j]. GetGU ();

int index=0;

int[] nd;

for (int k = 0; k < 3; k++)

{

if (gu[k] == 1)

{

nd = KG[j]. N ();

index = nd[k];

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

{

gK[index * 2, i] = 0;

gK[index * 2 + 1, i] = 0;

gK[i, index * 2] = 0;

gK[i, index * 2 + 1] = 0;

}

gK[index * 2, index * 2] = 1;

gK[index * 2 + 1, index * 2 + 1] = 1;

RR[index * 2] = 0;

RR[index * 2 + 1] = 0;

}

}

}

usel = Convert. ToInt32(textBox11.Text);

double Fx = double. Parse (textBox7.Text);

double Fy = double. Parse (textBox8.Text);

RR[usel * 2] = Fx;

RR[usel * 2 + 1] = Fy;

int maxInd = 0;

maxX = 0;

maxY = 0;

X=new double[KolUsel*2];

X = matrixOperation. gausSLAU (gK, RR);

int kk = 0;

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

{

if (Math.Abs (maxX) <= Math. Abs (X[i]))

{

maxX = X[i];

}

}

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

{

if (Math.Abs (maxY) <= Math. Abs (X[i]))

{

maxY= X[i];

}

}

MessageBox.Show («Расчет завершенn maxX = «+ maxX. ToString () + «n maxY = «+ maxY. ToString ());

double maxDxDy = 2 * R * double. Parse (textBox6.Text)/100;

label16.Text = «max U="+Math.Round (maxX, 7).ToString ();

label17.Text = «max V="+Math.Round (maxY, 7).ToString ();

if (maxX > maxDxDy || maxY > maxDxDy)

label18.Text = «Состояние: разрушение» ;

else

label18.Text = «Состояние: ок» ;

t = 2;

panel1.Refresh ();

button4.Enabled = true;

}

private void button4_Click (object sender, EventArgs e)

{

result view = new result ();

//view.dataGridView1.RowCount = nomer_treug*KolUsel*2;

int k=0;

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

{

double[] x = KG[i]. X ();

double[] y = KG[i]. Y ();

int[] N = KG[i]. N ();

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

{

view.dataGridView1.RowCount = k + 1;

view.dataGridView1[0, k]. Value = (i+1).ToString ();

view.dataGridView1[1, k]. Value = x[j]. ToString ();

view.dataGridView1[2, k]. Value = y[j]. ToString ();

view.dataGridView1[3, k]. Value = (N[j]+1).ToString ();

view.dataGridView1[4, k]. Value = X[N[j]*2]. ToString ();

view.dataGridView1[5, k]. Value = X[N[j]*2+1]. ToString ();

k++;

}

}

view.label1.Text="Количество узлов: «+KolUsel.ToString ();

view.label2.Text="Количество элементов: «+nomer_treug.ToString ();

view.label3.Text = «Максимальное смещение по X: «+ maxX. ToString ();

view.label4.Text = «Максимальное смещение по Y: «+ maxY. ToString ();

view.Show ();

}

private void Form1_KeyDown (object sender, KeyEventArgs e)

{

if (e.Control)

key = true;

}

private void Form1_KeyUp (object sender, KeyEventArgs e)

{

key = false;

}

private void hScrollBar1_Scroll (object sender, ScrollEventArgs e)

{

timer1.Stop ();

koordX += e. OldValue — e. NewValue;

timer1.Start ();

}

private void timer1_Tick (object sender, EventArgs e)

{

panel1.Refresh ();

timer1.Stop ();

}

}

public class KElement

{

int type;

double[] x;

double[] y;

int[] Num;

int material;

int[] GU;

public KElement (double x1, double y1, double x2, double y2, double x3, double y3, int[] Nu, int mat)

{

GU = new int[3];

x = new double[3];

y = new double[3];

x[0] = x1; x[1] = x2; x[2] = x3;

y[0] = y1; y[1] = y2; y[2] = y3;

Num = new int[3];

Num[0] = Nu[0]; Num[1] = Nu[1]; Num[2] = Nu[2];

Показать весь текст
Заполнить форму текущей работой