РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ CЛУ РАЗЛИЧНОЙ РАЗМЕРНОСТИ

VIII Международный конкурс научно-исследовательских и творческих работ учащихся
Старт в науке

РАЗРАБОТКА ПРОГРАММЫ ДЛЯ РЕШЕНИЯ CЛУ РАЗЛИЧНОЙ РАЗМЕРНОСТИ

Лашин В.А. 1
1МБОУ Одинцовская СОШ №16
Лашина Т.С. 1
1МБОУ Одинцовская СОШ №16
Автор работы награжден дипломом победителя II степени
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Паспорт проекта

Название проекта

Создание компьютера

Образовательное учреждение

МБОУ Одинцовская СОШ №16

Автор проекта

Лашин Виктор Алексеевич,9а класс

Научный руководитель

Лашина Т.С, учитель информатики и ИКТ

Цель

Разработка наиболее рациональной программы для решения СЛУ различной размерности

Задачи

 изучить основные методы решения СЛУ

 изучить определители

 изучить метод Крамера и метод Гаусса для решения СЛАУ различной размерности

 сравнить рациональность применения методов

 сделать программы на Pascal

 создать программу на С++

 сделать доклад

Результат (Продукт)

Рациональная программа для решения СЛУ с дополнительным функционалом.

Этапы работы:

Первый этап – подготовительный.

Результат - сбор информации о методах решения СЛУ, практика решения СЛУ различной размерности.

Второй этап – практический.

Результат – создание программ на Pascal.

Третий этап – исследовательский.

Результат – сравнение программ на ЯП Pascal, выбор наиболее рационального метода.

Четвертый этап – теоретическо-практический.

Результат – изучен ЯП С++, создана программа.

Пятый этап - отладка программы.

Результат – тестирование программы на конечных пользователях, отладка программы, исходя из пожеланий.

Шестой этап – заключительный.

Результат – подготовка презентации проекта

Материально-техническое обеспечение:

Компьютер, интернет, принтер, бумага, ПО ABC Pascal и С++, флешка

ВВЕДЕНИЕ

Данный проект о сравнении эффективности решения систем линейных уравнений различными методами и об их аналогах в программах на ЯП ABC Pascal и С++.

Проблема: Но каким способом пользоваться, если нет явных свойств системы уравнений? Есть способы, которые мы не изучаем в школе, такие как методы Гаусса и Крамера. Актуальность – на экзаменах в заданиях встречаются системы уравнений, и знать дополнительный метод их решения не помешает никому; применение опыта решения СЛУ различными способами способствует развитию логической культуры.

Цель. Разработка наиболее рациональной программы для решения СЛУ различной размерности.

Задачи:

изучить основные методы решения СЛУ

изучить определители

изучить метод Крамера и метод Гаусса для решения СЛАУ различной размерности

сравнить рациональность применения методов

сделать программы на Pascal

создать программу на С++

сделать доклад

Методы исследования:Сравнение, анализ, обобщение, эксперимент.

Продукт: рациональная программа для решения СЛУ с дополнительным функционалом.

1. Системы линейных уравнений

Определение.Система (1), где х, у – неизвестные, a1,a2,b1,b2, с1, с2 – коэффициенты системы (данные числа), называется системой двух линейных уравнений с двумя неизвестными.

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

2. Основные методы решения систем линейных уравнений 2-го порядка

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

система имеет единственное решение – прямые пересекаются,

система не имеет решений – прямые параллельны,

система имеет бесчисленное множество решений – прямые совпадают.

2.1. Графический метод

АЛГОРИТМ: Способ заключается в построении графика каждого уравнения, входящего в данную систему, в одной координатной плоскости и нахождении точки пересечения этих графиков. Координаты этой точки (x; y) и будут являться решением данной системы уравнений.

Если прямые, являющиеся графиками уравнений системы, пересекаются, то система уравнений имеет единственное решение.

Если прямые, являющиеся графиками уравнений системы, параллельны, то система уравнений не имеет решений.

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

2.2. Метод подстановки

Заключается в том, что используя одно из уравнений, выражаем y, а затем подставляем полученное выражение во второе уравнение, вместо y. Решаем уравнение с одной переменной, находим x, а затем и y.

АЛГОРИТМ:

Выразить y в первом уравнении.

Подставить выражение, которое получилось в первом (то есть, чему равно y), во второе уравнение вместо y.

Найти x, используя полученное уравнение.

Найти y, используя уравнение, которое получили при первом действии.

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

2.3. Способ сложения

Алгоритм решения системы линейных уравнений с двумя неизвестными способом сложения:

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

2. Складывая или вычитая полученные уравнения получить линейное уравнение с одним неизвестным

3. Решить полученное уравнение с одним неизвестным и найти одну из переменных.

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

5. Сделать проверку решения.

3. Метод Крамера для решения СЛУ

1) Решим систему:

Умножим первое уравнение этой системы на b2≠0, а второе уравнение на (-b1)≠0, тогда данная система приобретает вид:

Сложим уравнения полученной системы (при этом у нас получится неизвестное у):

;

если выражение ≠0, то можно выразить неизвестное х:

, ≠0

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

≠0

≠0

Условимся выражение обозначать . Тогда выражение

= , а =

Числа a1,a2,b1,b2 – элементы определителя, a1,b2 – главная диагональ, a2,b1 – вспомогательная диагональ. Чтобы вычислить определитель второго порядка достаточно найти разность произведений элементов главной и вспомогательной диагоналей.Обозначения:

∆= ∆x= ∆y=

Определитель ∆x получается из ∆ заменой элементов первого столбца свободными членами системы; аналогично получается ∆y.

Т аблица. Условия, определяющие число решений системы линейных уравнений

В приложении №1 – примеры решения СЛУ 2-го порядка методом Крамера.

4. Метод Гаусса для решения СЛУ

Метод  Гаусса – наиболее мощный и универсальный инструмент для нахождения решения любой системы линейных уравнений. Правило Крамера и матричный метод непригодны в тех случаях, когда система имеет бесконечно много решений или несовместна. А метод последовательного исключения неизвестных в любом случае приведет нас к ответу.

5. Сравнение методов решений

Для оценки рациональности использования того или иного метода в программирование при решении систем уравнений 2-го порядка взял следующие критерии:

- скорость выполнения задания;

- точность ответов

Для объективности брал в равной мере как примеры «удобные» для решения тем или иным способом так и «неудобные» и сравнивали их решение с решением в программах на ЯП Pascal. Каждый критерий оценен по 10-бальной шкале.

Подробное решение и сравнение, а также выводы по каждому сравнению можно увидеть в приложении №3.

5.1. Метод Крамера и графический метод

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

5.2. Метод Крамера и метод подстановки

Мне показались два метода равнозначно удобными. Но анализ полученных данных не совпал с субъективным мнением. И хоть по скорости выполнения способ подстановки обогнал метод Крамера, но более точный результаты у последнего. Точность в способе подстановки пострадала из-за запутанности решений некоторых систем линейных уравнений.

5.3. Метод Крамера и способ сложения

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

Получаем, что решение СЛУ 2 порядка способом сложения или способом подстановки дают точное решение, что не всегда удается достичь при решении графически. Но, решая СЛУ более 2 порядка этими способами тяжело, удобнее воспользоваться методом Крамера или методом Гаусса.

5.4. Метод Крамера и метод Гаусса

Метод Гаусса быстрее м-да Крамера. По точности - одинаковы. Считать для СЛУ размерности большей, чем 2 на 2 – неудобно вручную.

А что если написать программы для решения систем линейных уравнений методом Крамера/методом Гаусса? Именно это я и сделал целью нашего проекта.

Средой разработки была выбрана ABC Pascal.

6. Разработка программ

6.1. Разработка программ на Pascal

Выяснил на собственном опыте, что считать СЛУ больших размерностей неудобно вручную. Тогда для решения систем линейных уравнений размерности большей, чем 2 на 2, было решено разработать программы на ЯП Pascal ABC и сравнить их друг с другом.

6.1.1. Разработка программы. Способ сложения

В этой программе использовал 3 массива в типе real, оператор If, циклы for. Полностью с программой можно познакомиться в Приложении2. п.1

Пример работы программы для СЛУ:

- Вводим коэффициенты

- Далее вводим свободные члены

- Программа выводит на экран корни системы

6.1.2. Разработка программы. Способ подстановки

В этой программе использовал 3 массива в типе real, оператор If, циклы for. Полностью с программой можно познакомиться в Приложении2. п.2

Пример работы программы для СЛУ:

6 .1.3. Разработка программы. Метод Крамера

В этой программе использовал оператор If. Полностью с программой можно познакомиться в Приложении2. п.3

Пример работы программы для СЛУ:

6.1.4. Разработка программы. Метод Крамера для n-размерности

В этой программе использовал 3 массива в типе real, оператор If, циклы for. Полностью с программой можно познакомиться в Приложении2. п.4

Вводим размерность

Далее вводим коэффициенты

Потом вводим свободные члены

Решение

6.1.5. Разработка программы. Метод Гаусса для n-размерности

В этой программе использовал 3 массива в типе real, оператор If, циклы for. Полностью с программой можно познакомиться в Приложении2. п.5

Вводим размерность

Далее вводим расширенную матрицу

Программа выдает решение

6.1.6. Сравнение. Метод Крамера и Гаусса на листочке и в Pascal

Применение методов Крамера или Гаусса во всех примерах на ЯП Pascal оказались гораздо точнее, но уступали в СЛУ размерностью 2x2 скоростью.

Скорость

Точность

В результате выполненной работы получил, что программа неудобна для использования для решения СЛУ маленькой размерности, но при этом выигрывает для систем линейных уравнений, начиная с 3 порядка.

6.1.7. Сравнение программ на Pascal.

Я создал программы на метод подстановки, на метод сложения, на метод Крамера и на метод Гаусса (для СЛУ 2 порядка) и на метод Крамера и на метод Гаусса (для систем линейных уравнений от 2 до 10 размерности). Из них более рациональными в использовании кажутся две последние, т.к. можно использовать для СЛУ любого порядка (до 10-го). Поэтому их я и решил сравнить.

С помощью компиляции в PascalABC.NET сравнили решение СЛУ в программе «Крамер на n-размерность» с решением программе «Гаусс на n-размерность». Сравнивали по скорости выполнения данных:

Как видно из графика, нашей программе по методу Гаусса требуется немного больше времени. Но мне нравится использовать обе программы. И для обычного пользователя данная «потеря» времени незначительна и даже незаметна. Поэтому предлагаю проверять свои решения СЛУ с помощью этих программ!

Я выяснил на собственном опыте (см. приложение), что считать СЛУ больших размерностей неудобно вручную. Тогда для решения систем линейных уравнений размерности большей, чем 2 на 2, решил разработать программу на ЯП С++.

6.2. Разработка программы на С++.

Но ЯП Pascal является учебным и не предназначен для создания мощных проектов. Поэтому перешел на С++.

6.2.1. Реализация метода Крамера на С++.

Я решил выбрать метод Крамера для написания программы на С++, так как он показался легко записываемым в качестве формул. Написал программу на размерность до 4 и проверили ее, сравнив с решением на листочке и в предыдущей программе на Pascal.

Далее дополнил программу дополнительными функциями для того, чтобы она была более интересной. Добавленные функции: калькулятор, нахождение тригонометрических функций (косинус, синус, тангенс, котангенс), решение квадратных уравнений, нахождение большего или меньшего числа из множества, нахождения четных и нечетных чисел из множества, побайтовый сдвиг вправо и побайтовый сдвиг влево, нахождение значения log по основанию 2 и по основанию 10, таблица умножения и таблица квадратов, функция – запоминание числа, перевод из десятичной системы счисления в другую (начиная с двоичной и заканчивая 9-ой), нахождение корня числа и возведение в степень.

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

6.2.2. Метод Крамера на листочке и в С++

Применение метода Крамера во всех примерах на ЯП С++ оказались гораздо точнее, но уступали в СЛУ размерностью 2x2 скоростью. В результате выполненной работы я пришел к аналогичному выводу (что и в результате с программой на Pascal) - программа неудобна для использования для решения СЛУ маленькой размерности, но при этом выигрывает для систем линейных уравнений, начиная с 3 порядка.

6.2.3. Мнение пользователей.

Программу дал опробовать нашим ровесникам и учителям нашей школы. В тестировании программы приняло участие 30 учащихся 8 – 10 классов и 7 учителей. От каждого услышал, что нужно добавить и, что нужно улучшить. Я всегда прислушиваюсь к советам пользователей и поэтому у меня часто появляются новые версии.

6.2.4. Экономическая и экологическая оценка.

Экономический аспект включает: амортизацию компьютерной техники, электричество, оплату интернет-трафика. Бумагу, картридж, интернет, ПО – все предоставила школа (бесплатно).

Потребовались значительные временные затраты – с августа 2018г. по текущее время: сначала изучали СЛУ, повторяли методы, изучаемые в школе, изучили м-ды Крамера и Гаусса, отработали навыки решения СЛУ, написали программы на ЯП Паскаль, проанализировали, протестировали, изучили С++, написали программу, протестировали на группе людей, проанализировали, доработали, опять тестировали, дорабатывали (по текущее время), для вставки дополнительных функции в МегаКалькулятор, познакомились с основными тригонометрическими, логарифмическими функциями, повторили степенную и квадратичную, повторили системы счисления и перевод в из одной СС в другую и т.д. Получилось, что в неделю тратится в среднем по 12ч на работу над проектом.

Использование моей программы (см. Приложение 2, п.6) пользователем уменьшит время проведенное за компьютером, нагрузку на глаза и опорно-двигательный аппарат; сформирует навыки самоконтроля.

ЗАКЛЮЧЕНИЕ

В результате выполнения работы:

- Изучена литература по методам решения систем линейных уравнений.

- Подобраны и решены системы линейных уравнений 2 и более порядка основными методами, изучаемыми в школе.

- Подобраны и решены СЛУ 2 и более порядка методом Крамера и Гаусса.

- Было проведено сравнение типовых методов решения СЛУ 2-го порядка с методом Крамера, Гаусса и произведена оценка рациональности использования.

- Были созданы программы на ЯП Pascal.

- Была разработана программа на ЯП С++ (Мега калькулятор).

Метод Крамера и/или метод Гаусса позволяет существенно сократить время нахождения решений систем линейных уравнений, избежать «лишних» записей в сложных случаях. А в случае сравнения с графическим методом – дает точное решение (что не является его преимуществом перед остальными двумя методами, т.к. они дают тоже точное решение).

Мне кажется, метод Крамера и метод Гаусса доступен для изучения учащимся 8 классов при решении систем линейных уравнений 2 порядка и может быть предложен ученикам как дополнительный метод. А разработка программ для решения СЛУ – для кружковых и факультативных занятий по информатике.

МегаКалькулятор создан для использования в качестве самоконтроля и может пригодиться при использовании многих тем в алгебре и информатики.

Список литературы. Интернет-ресурсы.

Список литературы

1. Алгебра: дидактические материалы для 7 кл. / Л.И.Званич, Л.В. Кузнецова, С.Б. Суворова, - 12-е изд., дораб. – М.: Просвещение, 2007. – 160 с.

2. Математика: Справ.материалы: Кн.для учащихся. – М.: Просвещение, 1988. – 416с.

3. Сборник задач по алгебре. Часть II. Для 8 – 10 классов средней школы. / П.А.Ларичев, - уч.-изд. –М.: Государственное учебно-педагогическое издательство Министерства Просвещения РСФСР, 1952

4. Сборник заданий для проведения письменного экзамена по математике в восьмых классах общеобразовательных школ РСФСР. –2-е изд., дораб. - М.: Просвещение, 1985. – 64 с.

Список используемых Интернет-ресурсов

https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B0%D0%BC%D0%B5%D1%80,_%D0%93%D0%B0%D0%B1%D1%80%D0%B8%D1%8D%D0%BB%D1%8C – Г.Крамер

https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9A%D1%80%D0%B0%D0%BC%D0%B5%D1%80%D0%B0 – метод Крамера

http://www.mathematics-repetition.com/6-klass-mathematics/6-9-1-reshenie-sistem-lineynh-uravneniy-grafitcheskim-sposobom.html - графический метод

http://school-assistant.ru/?predmet=algebra&theme=reshenie_sistem_2_lin_uravnenij_2_perem_podstanovkiметод подстановки

http://www.nado5.ru/e-book/sposob-slozheniya - способ сложения

https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%93%D0%B0%D1%83%D1%81%D1%81%D0%B0 – метод Гаусса

https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D1%83%D1%81%D1%81,_%D0%9A%D0%B0%D1%80%D0%BB_%D0%A4%D1%80%D0%B8%D0%B4%D1%80%D0%B8%D1%85 – Карл Фридрих Гаусс

ПРИЛОЖЕНИЯ

Приложение №1. Примеры решения систем линейных уравнений 2-го порядка методом Крамера

Пример 1.

Здесь

= -31, , .

Система имеет единственное решение

=1, =2.

Пример 2.

Здесь

=0. При этом ≠0.

Коэффициенты пропорциональны, а свободные члены не подчинены той же пропорции. Система не имеет решений.

Пример 3.

=0, , .

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

(или ).

Приложение №2. Программы

Подбор систем линейных уравнений и их прорешивание всеми изучаемыми способами и методами занял наибольшее количество времени. Основные СЛУ, используемые нами, приведены в тетради. Здесь приведу код Мега калькулятора и первые программы в Паскале

1. Способсложения

Program slagenie ;

uses crt;

Var Q:array [1..100000] of real;

W:array [1..100000] of real ;

D:array [1..100000] of real;

e,r,t,y,u,i,o:integer;

Begin

Writeln('Введите размерность.');

readln(e);

writeln('Введитекоофициенты');

for i:=1 to e*e do

read(Q[i]);

writeln('Введитеответы');

for i:=1 to e do

read(W[i]);

D[1]:=Q[1]*Q[3];

D[2]:=Q[2]*Q[3];

D[3]:=W[1]*Q[3];

D[4]:=Q[3]*Q[1];

D[5]:=Q[4]*Q[1];

D[6]:=W[2]*Q[1];

If D[1]=D[4] then

Begin

D[4]:=-D[4];

D[5]:=-D[5];

D[6]:=-D[6]

end;

D[7]:=D[1]+D[4];

D[8]:=D[2]+D[5];

D[9]:=D[3]+D[6];

D[10]:=D[9]/D[8];

D[11]:=-D[10]*Q[2];

D[12]:=D[11]+W[1];

D[13]:=D[12]/Q[1];

Writeln('y=',D[10],' x=',D[13]);

end.

2. Способподстановки

program podstanovka;

Var Q: array [1..90] of real;

W: array [1..90] of real;

E: array [1..90] of real;

i,r,t,y,u:integer;

begin

writeln('Введитеразмерность');

read(r);

writeln('Введитеответы');

for i:=1 to r do

read(Q[i]);

writeln('Введитекоэффициенты');

for i:=1 to r*r do

read(W[i]);

E[1]:=-W[4]/W[3];

E[2]:=Q[2]/W[3];

E[3]:=E[1]*W[1]+W[2];

E[4]:=-E[2]*W[1]+Q[1];

E[5]:=E[4]/E[3];

E[6]:=(-E[5]*W[2]+Q[1])/W[1];

Writeln( 'x=',E[5 ] ,' y=' , E[6]);

end.

3. МетодКрамера

Program Kramer;

Var q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m,aA,aZ,kx,ky,kz,kv,bx,dx,cx,nx,ax,ay,by,dy,cy,ny,bz,dz,cz,nz,av,dv,bv,nv,cv:real;

begin

Writeln('Введите количество столбцов и сокращенных цифр в столбце минимум 2 2 максимум 10 10 они должны быть равны в дальнейшем при вводе вводим 0 например 2 3= 1 2 0 1 2 4');

readln(aA,aZ);

//2 на 2

IfaA=2 then

begin;

writeln ('Введите 6 чисел через пробел первое и четвертое число перед равно и без буквы. Второе и пятое с одинаковыми буквами. Третье и шестое также с одинаковыми буквами.');

readln (a,b,c,d,f,g);

k:=((b*g)-(f*c));

x:=((a*g)-(d*c));

y:=-((a*f)-(d*b));

y:=y/k;

x:=x/k;

Writeln('x=',x,' y=',y);

end;

//3 на 3

If aA=2 then

else if aA=3 then

begin;

writeln('Введите 12 чисел через пробел первое,пятое и девятое число перед равно и без буквы.');

Readln(q,w,e,r,t,y,u,i,o,p,a,s);

k:=w*((u*s)-(a*i))-e*((y*s)-(p*i))+r*((y*a)-(p*u));

x:=q*((u*s)-(a*i))-e*((t*s)-(o*i))+r*((t*a)-(o*u));

v:=-(q*((y*s)-(p*i))-w*((t*s)-(o*i))+r*((t*p)-(o*y)));

z:=w*((o*u)-(t*a))+q*((y*a)-(p*u))-e*((o*y)-(t*p));

kx:=x;

ky:=v;

kz:=z;

x:=x/k;

v:=v/k;

z:=z/k;

if (p=t)or (t=q) then x:=0;

if (p=t)or (t=q) then y:=0;

if (p=t)or (t=q) then z:=0;

writeln ('k=',k,' kx=',kx,' ky=',ky,' kz=',kz);

WriteLn('x=',x,' Y=',v,' Z=',z);

end;

//4 на 4

if aA=4 then

WriteLn('Введите 20 чисел 1,6,11,16- свободные числа');

ReadLn(ax,bx,dx,nx,cx,ay,by,dy,ny,cy,az,bz,dz,nz,cz,av,bv,dv,nv,cv);

k:=bx*(dy*((nz*cv)-(nv*cz))-ny*((dz*cv)-(dv*cz))+cy*((dz*nv)-(dv*nz)))-dx*(by*((nz*cv)-(nv*cz))-ny*((bz*cv)-(bv*cz))+cy*((bz*nv)-(bv*nz)))+nx*(by*((dz*cv)-(dv*cz))-dy*((bz*cv)-(bv*cz))+cy*((bz*dv)-(bv*dz)))-cx*(by*((dz*nv)-(dv*nz))-dy*((bz*nv)-(bv*nz))+ny*((bz*dv)-(bv*dz)));

kx:=ax*(dy*((nz*cv)-(nv*cz))-ny*((dz*cv)-(dv*cz))+cy*((dz*nv)-(dv*nz)))-dx*(ay*((nz*cv)-(nv*cz))-ny*((az*cv)-(av*cz))+cy*((az*nv)-(av*nz)))+nx*(ay*((dz*cv)-(dv*cz))-dy*((az*cv)-(av*cz))+cy*((az*dv)-(av*dz)))-cx*(ay*((dz*nv)-(dv*nz))-dy*((az*nv)-(av*nz))+ny*((az*dv)-(av*dz)));

ky:=-(ax*(by*((nz*cv)-(nv*cz))-ny*((bz*cv)-(bv*cz))+cy*((bz*nv)-(bv*nz)))-bx*(ay*((nz*cv)-(nv*cz))-ny*((az*cv)-(av*cz))+cy*((az*nv)-(av*nz)))+nx*(ay*((bz*cv)-(bv*cz))-by*((az*cv)-(av*cz))+cy*((az*bv)-(av*bz)))-cx*(ay*((bz*nv)-(bv*nz))-by*((az*nv)-(av*nz))+ny*((az*bv)-(av*bz))));

kz:=ax*(by*((dz*cv)-(dv*cz))-dy*((bz*cv)-(bv*cz))+cy*((bz*dv)-(bv*dz)))-bx*(ay*((dz*cv)-(dv*cz))-dy*((az*cv)-(av*cz))+cy*((az*dv)-(av*dz)))+dx*(ay*((bz*cv)-(bv*cz))-by*((az*cv)-(av*cz))+cy*((az*bv)-(av*bz)))-cx*(ay*((bz*dv)-(bv*dz))-by*((az*dv)-(av*dz))+dy*((az*bv)-(av*bz)));

kv:=-(ax*(by*((dz*nv)-(dv*nz))-dy*((bz*nv)-(bv*nz))+ny*((bz*dv)-(bv*dz)))-bx*(ay*((dz*nv)-(dv*nz))-dy*((az*nv)-(av*nz))+ny*((az*dv)-(av*dz)))+dx*(ay*((bz*nv)-(bv*nz))-by*((az*nv)-(av*nz))+ny*((az*bv)-(av*bz)))-nx*(ay*((bz*dv)-(bv*dz))-by*((az*dv)-(av*dz))+dy*((az*bv)-(av*bz))));

WriteLn(k);

WriteLn(kx);

WriteLn(ky);

WriteLN(kz);

WriteLN(kv);

WriteLn('x= ',kx/k);

WriteLn('y= ',ky/k);

WriteLN('z= ',kz/k);

WriteLN('v= ',kv/k);

end.

4. Метод Крамера для n-размерности

Program Kramer;

uses crt;

type

Tmass=array[1..20] of real;

Tmatrix=array[1..20] of Tmass;

procedure Per(k,n:integer;var a:Tmatrix;var p:integer);{перестановкастрокеслиглавныйэлемент = 0}

var z:Real;j,i:integer;

begin

z:=abs(a[k,k]);

i:=k;

p:=0;

for j:=k+1 to n do

begin

if abs(a[j,k])>z then{выбираем максимальный по модулю в данном столбце ниже}

begin

z:=abs(a[j,k]);

i:=j;

p:=p+1;{счетчик перестановок, при каждой перестановке меняется знак определителя}

end;

end;

if i>k then

for j:=k to n do

begin

z:=a[i,j];

a[i,j]:=a[k,j];

a[k,j]:=z;

end;

end;

function Znak(p:integer):integer;{определение знака определителя}

begin

if p mod 2=0 then

Znak:=1 else Znak:=-1;

end;

procedure Opr(n:integer;a:tmatrix;var det:real);{вычислениеопаределителя}

var k,i,j,p:integer;r:real;

begin

det:=1.0;

for k:=1 to n do

begin

if a[k,k]=0 then Per(k,n,a,p);{перестановкастрок}

det:=znak(p)*det*a[k,k];{вычисление определителя}

for j:=k+1 to n do {пересчеткоэффициентов}

begin

r:=a[j,k]/a[k,k];

for i:=k to n do

begin

a[j,i]:=a[j,i]-r*a[k,i];

end;

end;

end;

end;

var a:Tmatrix;{матрицакоэффициентовисходная}

c:array[1..20] of Tmatrix;{вспомогательные матрицы для вычисления корней}

b,x:Tmass;{свободные члены, корни}

det,det1:real;{определители}

n,k,j,i:integer;

begin

clrscr;

write('Порядоксистемы n=');

readln(n);

writeln('Введите коэффициенты системы:');

for i:=1 to n do

for j:=1 to n do

read(a[i,j]);

readln;

writeln('Введите свободные члены:');

for i:=1 to n do

read(b[i]);

readln;

clrscr;

writeln('Расширенная матрица системы:');

for i:=1 to n do

begin

for j:=1 to n do

write(a[i,j]:7:2);

write(b[i]:9:2);

writeln;

end;

Opr(n,a,det);{определитель системы исходной}

for i:=1 to n do

begin

for k:=1 to n do

begin

for j:=1 to n do{создаем вспомогательные матрицы, где i-товый столбец - свободные члены}

c[i][k,j]:=a[k,j];

c[i][k,i]:=b[k];

end;

Opr(n,c[i],det1);{определитедь вспомогательной матрицы}

if(det=0)and(det1=0) then

begin

writeln('Система не определена!');

readln;

exit;

end;

if(det=0)and(det1<>0) then

begin

writeln('Система не имеет решений!');

readln;

exit;

end;

x[i]:=det1/det;{корень}

end;

writeln('Корнисиcтемы:');

for i:=1 to n do

writeln('x',i,'=',x[i]:7:3);

readln

end.

5. МетодГаусса

Program Metod_Gauss;

Uses CRT;

Const maxn = 10;

Type

Data = Real;

Vector = Array[1..maxn] of Data;

Matrix = Array[1..maxn, 1..maxn] of Data;

Procedure ReadSystem(n: Integer; var a: Matrix; var b: Vector);

Var r, i, j: Integer;

Begin

r := WhereY;

GotoXY(2, r);

Write('A');

For i := 1 to n do begin

GotoXY(i*6+2, r);

Write(i);

GotoXY(1, r+i+1);

Write(i:2);

end;

GotoXY((n+1)*6+2, r);

Write('b');

For i := 1 to n do begin

For j := 1 to n do begin

GotoXY(j * 6 + 2, r + i + 1);

Read(a[i, j]);

end;

GotoXY((n + 1) * 6 + 2, r + i + 1);

Read(b[i]);

end;

End;

Procedure WriteX(n :Integer; x: Vector);

Var i: Integer;

Begin

For i := 1 to n do

Writeln('x', i, ' = ', x[i]);

End;

Function Gauss(n: Integer; a: Matrix; b: Vector; var x:Vector): Boolean;

Var

k, l, i, j: Integer;

m, q, t: Data;

Begin

For k := 1 to n - 1 do begin

m := 0;

l := 0;

For i := k to n do

If Abs(a[i, k]) > m then begin

l := i;

m := Abs(a[i, k]);

end;

If l = 0 then begin

Gauss := false;

Exit;

end;

If l <> k then begin

For j := 1 to n do begin

t := a[k, j];

a[k, j] := a[l, j];

a[l, j] := t;

end;

t := b[k];

b[k] := b[l];

b[l] := t;

end;

For i := k + 1 to n do begin

q := a[i, k] / a[k, k];

For j := 1 to n do

If j = k then

a[i, j] := 0

else

a[i, j] := a[i, j] - q * a[k, j];

b[i] := b[i] - q * b[k];

end;

end;

x[n] := b[n] / a[n, n];

For i := n - 1 downto 1 do begin

t := 0;

For j := 1 to n-i do

t := t + a[i, i + j] * x[i + j];

x[i] := (1 / a[i, i]) * (b[i] - t);

end;

Gauss := true;

End;

Var n, i: Integer;

a: Matrix ;

x, b: Vector;

Begin

ClrScr;

Writeln('Программа решения СЛАУ по методу Гаусса');

Writeln;

Writeln('Введите порядок матрицы системы (макс. 10)');

Repeat

Write('>');

Read(n);

Until (n > 0) and (n <= maxn);

Writeln;

Writeln('Введите расширенную матрицу системы');

ReadSystem(n, a, b);

Writeln;

If Gauss(n, a, b, x) then begin

Writeln('Результат вычислений по методу Гаусса');

WriteX(n, x);

end

else

Writeln('Данную систему нельзя решить по методу Гаусса');

Writeln;

End.

6. МегаКалькулятор. Программа на С++

#include <iostream>

#include <string>

#include <math.h>

#include <stdlib.h>

#include <cmath>

#include <windows.h>

const int NotUsed = system("color F0");

float cotan(float c)

{

c=cos(c)/sin(c) ;

return c;

}

void func ()

{

std::cout<<"Введитечисло. Ответ будет выведен в радианах.\n";

}

int main()

{

HANDLE hConsole = GetStdHandle( STD_OUTPUT_HANDLE );

setlocale(LC_ALL, "Russian");

char f;

double x=0;

std::string kill,f1;

int i,s,a;

double j;

j = 0;

for (;1==1;)

{

std :: cout << "\n ____________________________________________________________";

std :: cout << "\n|Выберите тип выражения: |\n|Если вы хотите выбрать арифметический тип, то введите 1 |\n|Если вы хотите выбрать действия с одним числом, то введите 2|\n|Если вы хотите выбрать логический тип, то введите 3 |\n|Если вы хотите выбрать выйти, то 9 |\n|Если вы хотите запомнить число, то нажмите 0 |\n";

std :: cout << " ------------------------------------------------------------\n" ;

std :: cin >> kill;

if (kill=="0")

{

system("cls");

std :: cout << "\n _____________________________";

std :: cout <<"\n|Введите число для запоминания|\n";

std :: cout << " -----------------------------\n" ;

std :: cin>>x;

std :: cout <<"Вы запомнили число "<<x<<"\n\n";

}

if(kill=="9")

break;

if (kill == "1")

{

system("cls");

std :: cout << "\n __________________________________________________________________";

std :: cout << "\n|Выберите функцию: |\n|Если вы хотите выбрать калькулятор, то введите 1 |\n|Если вы хотите выбрать решение СЛУ, то введите 2 |\n|Если вы хотите выбрать решение квадратных уравнений, то введите 3.|\n|Если вы хотите выбрать таблицу умножения, то введите 4 |\n|Если вы хотите выбрать таблицу квадратов, то введите 5 |\n";

std :: cout << " ------------------------------------------------------------------\n" ;

std :: cin >> f1;

if (f1=="1"){

double a,b;

for ( ;1==1; )

{

std::cout<<"Введите выражение для окончания ввода введите после числа =0\n";

double A[100],k=0;

char S[100];

int a=0;

for (int i=0;1==1;i++)

{

if (i==0)

{

std::cin>>A[i];

k=A[0];

i++;

}

std::cin >>S[a]>>A[i];

if (S[a] == '+')

{

k+=A[i];

}

if (S[a] == '-')

{

k-=A[i];

}

if (S[a] == '*')

{

k*=A[i];

}

if (S[a] == '/')

{

k/=A[i];

}

if(S[a]=='=')

break;

a++;

}

std::cout<<" Ответ = "<<k<<" ";

std::cout<<"Для выхода введите 0\nдля продолжения введите любой символ кроме 0\n";

std::string n;

std::cin>>n;

std::cout<<"\n";

if (n=="0")

break;

}

}

if (f1 == "2")

{

int r,i,t;

std :: cout << "\nВведите размерность СЛУ\n";

std :: cin >> r;

std :: cout << "Введите свободные члены\n";

double A[r], F[r][r],S[r+1],D[r];

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

std :: cin >> A[i];

std :: cout << "Введите коэффициенты\n";

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

{

for (t=0; t<r; t++)

std :: cin >> F[i][t];

}

if (r==2)

{

S[0]=F[0][0]*F[1][1]-F[1][0]*F[0][1];

S[1]=A[0]*F[1][1]-A[1]*F[0][1];

S[2]=F[0][0]*A[1]-F[1][0]*A[0];

if(S[0]==0)

{

if(S[1]==S[0])

{

if (S[2]==S[0])

{

system("cls");

std :: cout<<"\nБесконечное множество решений\n\n";

}

}

else

{

system("cls");

std::cout<<"\nНетрешений";

}

}

else

{

system("cls");

S[1]=S[1]/S[0];

S[2]=S[2]/S[0];

std :: cout <<"\n";

std :: cout <<"x="<<S[1]<<" y="<<S[2]<<"\n\n";

}

}

if (r==3)

{

S[0]=(F[0][0]*(F[1][1]*F[2][2]-F[2][1]*F[1][2])- F[0][1]*(F[1][0]*F[2][2]-F[2][0]*F[1][2])+F[0][2]*(F[1][0]*F[2][1]-F[2][0]*F[1][1]));

S[1]=A[0]*(F[1][1]*F[2][2]-F[2][1]*F[1][2])- F[0][1]*(A[1]*F[2][2]-A[2]*F[1][2])+F[0][2]*(A[1]*F[2][1]-A[2]*F[1][1]);

S[2]=F[0][0]*(A[1]*F[2][2]-A[2]*F[1][2])- A[0]*(F[1][0]*F[2][2]-F[2][0]*F[1][2])+F[0][2]*(F[1][0]*A[2]-F[2][0]*A[1]);

S[3]=F[0][0]*(F[1][1]*A[2]-F[2][1]*A[1])- F[0][1]*(F[1][0]*A[2]-F[2][0]*A[1])+A[0]*(F[1][0]*F[2][1]-F[2][0]*F[1][1]);

if(S[0]==0)

{

if(S[1]==S[0])

{

if (S[2]==S[0])

if(S[3]==S[0])

{

system("cls");

std :: cout<<"Бесконечное множество решений\n\n";

}

}

else

{

system("cls");

std::cout<<"Нетрешений";

}

}

else

{

system("cls");

S[1]=S[1]/S[0];

S[2]=S[2]/S[0];

S[3]=S[3]/S[0];

std :: cout <<"\n";

std :: cout <<"x="<<S[1]<<" y="<<S[2]<<" z="<<S[3]<<"\n\n";

}

}

}

if (f1=="3")

{

system("cls");

std::cout<<"\nВведитекоэффициенты\n";

double a,b,c,D,x1,x2;

std :: cin>>a>>b>>c;

D=b*b-4*a*c;

if (D<0)

std :: cout<<"Неткорней\n\n";

else

{

if (D==0)

{

x1=-b/(2*a);

std :: cout<<"Вашответ:\n х = "<<x1<<"\n\n";

}

else

{

x1=(-b+sqrt(D))/(2*a);

x2=(-b-sqrt(D))/(2*a);

std::cout<<"Вашответ:\nx1 = "<<x1<<" x2 = "<<x2<<"\n\n";

}

}

}

if(f1=="4")

{

system("cls");

std :: cout<<"\nВведите размеры таблицы умножения (от и до)\n";

int i,c,l,k;

std::cin>>k>>l;

for(i=k;i<=l;i++)

{

for(c=k;c<=l;c++)

std::cout<<c*i<<" ";

std :: cout <<"\n";

}

std :: cout << "\n";

}

if(f1=="5")

{

system("cls");

std :: cout<<"\nВведите размеры таблицы квадратов (от и до)\n";

int i,c,l,k;

std::cin>>k>>l;

for(i=k;i<=l;i++)

{

std::cout<<i*i<<" ";

if (i%10==0)

{

std::cout<<"\n";

}

}

std::cout<<"\n\n";

}

}

if (kill == "2"){

system("cls");

int d,f;

std :: cout << "\n ______________________________________________________________________";

std :: cout << "\n|Доступные действия с одним числом: |\n|Если вы хотите выбрать побайтовый сдвиг вправо, то введите 1 |\n|Если вы хотите выбрать побайтовый сдвиг влево, то введите 2 |\n|Если вы хотите выбрать перевод из десятичной СС в другую, то введите 3|\n|Если вы хотите выбрать нахождения корня числа, то введите 4 |\n|Если вы хотите выбрать возведение в степень, то введите 5 |\n|Если вы хотите выбрать нахождение логарифма, то введите 6 |\n|Для перехода во второй раздел функций введите 7 |\n";

std :: cout << " ----------------------------------------------------------------------\n" ;

std :: cin >> s;

switch (s)

{

case 1:

{

system("cls");

std :: cout << "\nВведите число\n";

std :: cin >> d;

std :: cout <<"Введите на сколько элементов будет совершён побайтовый сдвиг\n";

std :: cin >> f;

j = d >> f;

std :: cout<<j<<"\n\n";

break;

}

case 2:

{

system("cls");

std :: cout << "\nВведитечисло\n";

std :: cin >> d;

std :: cout <<"Введите на сколько элементов будет совершён побайтовый сдвиг\n";

std :: cin >> f;

j = d << f;

std :: cout<<j<<"\n\n";

break;

}

case 3:

{

system("cls");

int a,i,b,f,c=0,d=1,s=1;

std :: cout <<"\nВведите число\n";

std :: cin>>f;

for (i=2; i!=10;i++)

{

c=0;

a=f;

d=1;

s++;

while (a!=0)

{

b=a%s;

c=c+b*d;

d=d*10;

a=a/s;

}

std :: cout <<"\n В "<<i<<"-й "<<c<<"\n";

}

std::cout<<"\n";

break;

}

case 4:

{

system("cls");

std::cout<<"\nВведитечисло\n";

double j;

std::cin>>j;

j=sqrt(j);

std :: cout << j<<"\n\n";

break;

}

case 5:

{

system("cls");

std::cout<<"\nВведите число и степень в которую вы хотите возвести число\n";

double j,s,k,l;

std::cin>>j>>s;

l=j;

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

j=j*l;

std :: cout << j<<"\n\n";

break;

}

case 6:

{

system("cls");

char visit;

std :: cout <<"\nЕсли вы хотите выбрать логарифм с основанием 2, то введите 1\nЕсли вы хотите выбрать логарифм с основанием 10, то введите 2\n";

std :: cin>>visit;

if (visit=='1')

{

std :: cout <<"Введите число\n";

double c;

std :: cin>>c;

a=log2(c);

std :: cout<<a<<"\n\n";

break;

}

if (visit=='2')

{

std :: cout <<"Введитечисло\n";

double c;

std :: cin>>c;

a=log10(c);

std :: cout<<a<<"\n\n";

break;

}

}

case 7:

{

system("cls");

std :: cout << "\n __________________________________________________________";

std :: cout <<"\n|Если вы хотите выбрать нахождение косинуса, то введите 1 |\n|Если вы хотите выбрать нахождение синуса, то введите 2 |\n|Если вы хотите выбрать нахождение тангенса, то введите 3 |\n|Если вы хотите выбрать нахождение котангенса, то введите 4|\n";

std :: cout << " ----------------------------------------------------------\n" ;

std :: string kot;

std::cin>>kot;

if (kot=="1")

{

func();

double c;

std :: cin>>c;

c= cos (c);

std :: cout<<c<<"\n\n";

}

if (kot=="2")

{

func();

double c;

std :: cin>>c;

c= sin (c);

std :: cout<<c<<"\n\n";

}

if (kot=="3")

{

func();

double c;

std :: cin>>c;

c= tan (c);

std :: cout<<c<<"\n\n";

}

if (kot=="4")

{

func();

float c;

std :: cin>>c;

c=cotan(c);

std :: cout<<c<<"\n\n";

}

}

default:

{

kill == "2";

break;

}

}

}

if (kill == "3"){

system("cls");

std :: cout << "\n ______________________________________________________________";

std :: cout <<"\n|Выберите тип логической операции: |\n|Если вы хотите выбрать нахождение большего числа, то введите 1|\n|Если вы хотите выбрать нахождение меньшего числа, то введите 2|\n|Если вы хотите выбрать вывод четных чисел, то введите 3 |\n|Если вы хотите выбрать вывод нечетных чисел, то введите 4 |\n";

std :: cout << " --------------------------------------------------------------\n" ;

std :: cin >> kill;

if (kill == "1")

{

system("cls");

std :: cout <<"\nВведитеколичествочисел\n";

std :: cin >>a ;

std :: cout <<"Введитечисла\n";

double A[a];

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

{

std :: cin >> A[i];

if (A[i] > j)

j = A[i];

}

std :: cout<<"Большеечисло = "<<j<<"\n\n";

}

if (kill == "2")

{

system("cls");

std :: cout <<"\nВведитеколичествочисел\n";

std :: cin >>a ;

double A[a];

j=1000000000000;

std :: cout << "Введите числа. Небольше 1000000000000\n";

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

{

std :: cin >> A[i];

if (A[i] < j)

j = A[i];

}

std :: cout<<"Меньшее число равно = "<<j<<"\n\n";

}

if (kill == "3")

{

system("cls");

std :: cout << "\nВведите количесво чисел\n";

std :: cin >> a;

double A[a];

int S[a];

int y=0;

std :: cout << "Введитечисла. Толькоцелые\n";

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

{

std :: cin >> S[i];

}

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

{

if (S[i] % 2 == 0)

y++;

}

if (y==0)

std :: cout<<"Здесьнетчетныхчисел\n";

else

{

std :: cout <<"Вот четные числа:\n";

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

{

if (S[i] % 2 == 0)

std::cout<<S[i];;

}

}

std :: cout <<"\n";

}

if (kill == "4")

{

system("cls");

std :: cout << "\nВведитеколичесвочисел\n";

std :: cin >> a;

double A[a];

std :: cout << "Введите числа. Только целые.\n";

int S[a],y=0;

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

{

std :: cin >> S[i];

}

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

{

if (S[i] % 2 != 0)

y++;

}

if (y==0)

std :: cout<<"Здесьнетнечетныхчисел\n";

else

{

std :: cout <<"Вот нечетные числа:\n";

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

{

if (S[i] % 2 != 0)

std::cout<<S[i];;

}

}

std :: cout<<"\n";

}

}

}

return 0;

}

Просмотров работы: 73