Паспорт проекта
Название проекта |
Создание компьютера |
Образовательное учреждение |
МБОУ Одинцовская СОШ №16 |
Автор проекта |
Лашин Виктор Алексеевич,9а класс |
Научный руководитель |
Лашина Т.С, учитель информатики и ИКТ |
Цель |
Разработка наиболее рациональной программы для решения СЛУ различной размерности |
Задачи |
изучить основные методы решения СЛУ изучить определители изучить метод Крамера и метод Гаусса для решения СЛАУ различной размерности сравнить рациональность применения методов сделать программы на Pascal создать программу на С++ сделать доклад |
Результат (Продукт) |
Рациональная программа для решения СЛУ с дополнительным функционалом. |
Этапы работы: |
Первый этап – подготовительный. Результат - сбор информации о методах решения СЛУ, практика решения СЛУ различной размерности. Второй этап – практический. Результат – создание программ на Pascal. Третий этап – исследовательский. Результат – сравнение программ на ЯП Pascal, выбор наиболее рационального метода. Четвертый этап – теоретическо-практический. Результат – изучен ЯП С++, создана программа. Пятый этап - отладка программы. Результат – тестирование программы на конечных пользователях, отладка программы, исходя из пожеланий. Шестой этап – заключительный. Результат – подготовка презентации проекта |
Материально-техническое обеспечение: |
Компьютер, интернет, принтер, бумага, ПО ABC Pascal и С++, флешка |
Данный проект о сравнении эффективности решения систем линейных уравнений различными методами и об их аналогах в программах на ЯП ABC Pascal и С++.
Проблема: Но каким способом пользоваться, если нет явных свойств системы уравнений? Есть способы, которые мы не изучаем в школе, такие как методы Гаусса и Крамера. Актуальность – на экзаменах в заданиях встречаются системы уравнений, и знать дополнительный метод их решения не помешает никому; применение опыта решения СЛУ различными способами способствует развитию логической культуры.
Цель. Разработка наиболее рациональной программы для решения СЛУ различной размерности.
Задачи:
изучить основные методы решения СЛУ
изучить определители
изучить метод Крамера и метод Гаусса для решения СЛАУ различной размерности
сравнить рациональность применения методов
сделать программы на Pascal
создать программу на С++
сделать доклад
Методы исследования:Сравнение, анализ, обобщение, эксперимент.
Продукт: рациональная программа для решения СЛУ с дополнительным функционалом.
Определение.Система (1), где х, у – неизвестные, a1,a2,b1,b2, с1, с2 – коэффициенты системы (данные числа), называется системой двух линейных уравнений с двумя неизвестными.
Существует три способа решения систем линейных уравнений: графический, подстановки и сложения.
При решении таких систем возможны следующие случаи:
система имеет единственное решение – прямые пересекаются,
система не имеет решений – прямые параллельны,
система имеет бесчисленное множество решений – прямые совпадают.
АЛГОРИТМ: Способ заключается в построении графика каждого уравнения, входящего в данную систему, в одной координатной плоскости и нахождении точки пересечения этих графиков. Координаты этой точки (x; y) и будут являться решением данной системы уравнений.
Если прямые, являющиеся графиками уравнений системы, пересекаются, то система уравнений имеет единственное решение.
Если прямые, являющиеся графиками уравнений системы, параллельны, то система уравнений не имеет решений.
Если прямые, являющиеся графиками уравнений системы, совпадают, то система уравнений имеет бесконечное множество решений.
Заключается в том, что используя одно из уравнений, выражаем y, а затем подставляем полученное выражение во второе уравнение, вместо y. Решаем уравнение с одной переменной, находим x, а затем и y.
АЛГОРИТМ:
Выразить y в первом уравнении.
Подставить выражение, которое получилось в первом (то есть, чему равно y), во второе уравнение вместо y.
Найти x, используя полученное уравнение.
Найти y, используя уравнение, которое получили при первом действии.
Выполнить проверку решения.
Алгоритм решения системы линейных уравнений с двумя неизвестными способом сложения:
1. Если требуется, путем равносильных преобразований уравнять коэффициенты при одной из неизвестных переменных в обоих уравнениях.
2. Складывая или вычитая полученные уравнения получить линейное уравнение с одним неизвестным
3. Решить полученное уравнение с одним неизвестным и найти одну из переменных.
4. Подставить полученное выражение в любое из двух уравнений системы и решить это уравнение, получив, таким образом, вторую переменную.
5. Сделать проверку решения.
1) Решим систему:
Умножим первое уравнение этой системы на b2≠0, а второе уравнение на (-b1)≠0, тогда данная система приобретает вид:
Сложим уравнения полученной системы (при этом у нас получится неизвестное у):
;
если выражение ≠0, то можно выразить неизвестное х:
, ≠0
подставим полученное значение х в одно из уравнений системы и найдем значение у:
≠0
≠0
Условимся выражение обозначать . Тогда выражение
= , а =
Числа a1,a2,b1,b2 – элементы определителя, a1,b2 – главная диагональ, a2,b1 – вспомогательная диагональ. Чтобы вычислить определитель второго порядка достаточно найти разность произведений элементов главной и вспомогательной диагоналей.Обозначения:
∆= ∆x= ∆y=
Определитель ∆x получается из ∆ заменой элементов первого столбца свободными членами системы; аналогично получается ∆y.
Т аблица. Условия, определяющие число решений системы линейных уравнений
В приложении №1 – примеры решения СЛУ 2-го порядка методом Крамера.
Метод Гаусса – наиболее мощный и универсальный инструмент для нахождения решения любой системы линейных уравнений. Правило Крамера и матричный метод непригодны в тех случаях, когда система имеет бесконечно много решений или несовместна. А метод последовательного исключения неизвестных в любом случае приведет нас к ответу.
Для оценки рациональности использования того или иного метода в программирование при решении систем уравнений 2-го порядка взял следующие критерии:
- скорость выполнения задания;
- точность ответов
Для объективности брал в равной мере как примеры «удобные» для решения тем или иным способом так и «неудобные» и сравнивали их решение с решением в программах на ЯП Pascal. Каждый критерий оценен по 10-бальной шкале.
Подробное решение и сравнение, а также выводы по каждому сравнению можно увидеть в приложении №3.
Метод Крамера во всех примерах оказался гораздо точнее. Графический метод – специфический и служит больше для визуального представления решения систем линейных уравнений в виде пересечения двух графиков.
Мне показались два метода равнозначно удобными. Но анализ полученных данных не совпал с субъективным мнением. И хоть по скорости выполнения способ подстановки обогнал метод Крамера, но более точный результаты у последнего. Точность в способе подстановки пострадала из-за запутанности решений некоторых систем линейных уравнений.
Эти два метода показались практически равнозначны. Более сложные системы с дробными коэффициентами при неизвестных удобнее решать все же методом Крамера, но если коэффициенты натуральные числа, то гораздо быстрее система решается способом сложения.
Получаем, что решение СЛУ 2 порядка способом сложения или способом подстановки дают точное решение, что не всегда удается достичь при решении графически. Но, решая СЛУ более 2 порядка этими способами тяжело, удобнее воспользоваться методом Крамера или методом Гаусса.
Метод Гаусса быстрее м-да Крамера. По точности - одинаковы. Считать для СЛУ размерности большей, чем 2 на 2 – неудобно вручную.
А что если написать программы для решения систем линейных уравнений методом Крамера/методом Гаусса? Именно это я и сделал целью нашего проекта.
Средой разработки была выбрана ABC Pascal.
Выяснил на собственном опыте, что считать СЛУ больших размерностей неудобно вручную. Тогда для решения систем линейных уравнений размерности большей, чем 2 на 2, было решено разработать программы на ЯП Pascal ABC и сравнить их друг с другом.
В этой программе использовал 3 массива в типе real, оператор If, циклы for. Полностью с программой можно познакомиться в Приложении2. п.1
Пример работы программы для СЛУ:
- Вводим коэффициенты
- Далее вводим свободные члены
- Программа выводит на экран корни системы
В этой программе использовал 3 массива в типе real, оператор If, циклы for. Полностью с программой можно познакомиться в Приложении2. п.2
Пример работы программы для СЛУ:
В этой программе использовал оператор If. Полностью с программой можно познакомиться в Приложении2. п.3
Пример работы программы для СЛУ:
В этой программе использовал 3 массива в типе real, оператор If, циклы for. Полностью с программой можно познакомиться в Приложении2. п.4
Вводим размерность
Далее вводим коэффициенты
Потом вводим свободные члены
Решение
В этой программе использовал 3 массива в типе real, оператор If, циклы for. Полностью с программой можно познакомиться в Приложении2. п.5
Вводим размерность
Далее вводим расширенную матрицу
Программа выдает решение
Применение методов Крамера или Гаусса во всех примерах на ЯП Pascal оказались гораздо точнее, но уступали в СЛУ размерностью 2x2 скоростью.
Скорость
Точность
В результате выполненной работы получил, что программа неудобна для использования для решения СЛУ маленькой размерности, но при этом выигрывает для систем линейных уравнений, начиная с 3 порядка.
Я создал программы на метод подстановки, на метод сложения, на метод Крамера и на метод Гаусса (для СЛУ 2 порядка) и на метод Крамера и на метод Гаусса (для систем линейных уравнений от 2 до 10 размерности). Из них более рациональными в использовании кажутся две последние, т.к. можно использовать для СЛУ любого порядка (до 10-го). Поэтому их я и решил сравнить.
С помощью компиляции в PascalABC.NET сравнили решение СЛУ в программе «Крамер на n-размерность» с решением программе «Гаусс на n-размерность». Сравнивали по скорости выполнения данных:
Как видно из графика, нашей программе по методу Гаусса требуется немного больше времени. Но мне нравится использовать обе программы. И для обычного пользователя данная «потеря» времени незначительна и даже незаметна. Поэтому предлагаю проверять свои решения СЛУ с помощью этих программ!
Я выяснил на собственном опыте (см. приложение), что считать СЛУ больших размерностей неудобно вручную. Тогда для решения систем линейных уравнений размерности большей, чем 2 на 2, решил разработать программу на ЯП С++.
Но ЯП Pascal является учебным и не предназначен для создания мощных проектов. Поэтому перешел на С++.
Я решил выбрать метод Крамера для написания программы на С++, так как он показался легко записываемым в качестве формул. Написал программу на размерность до 4 и проверили ее, сравнив с решением на листочке и в предыдущей программе на Pascal.
Далее дополнил программу дополнительными функциями для того, чтобы она была более интересной. Добавленные функции: калькулятор, нахождение тригонометрических функций (косинус, синус, тангенс, котангенс), решение квадратных уравнений, нахождение большего или меньшего числа из множества, нахождения четных и нечетных чисел из множества, побайтовый сдвиг вправо и побайтовый сдвиг влево, нахождение значения log по основанию 2 и по основанию 10, таблица умножения и таблица квадратов, функция – запоминание числа, перевод из десятичной системы счисления в другую (начиная с двоичной и заканчивая 9-ой), нахождение корня числа и возведение в степень.
Дальше встал вопрос об оформлении приложения. Для этого использовались функции изменения размера текста, цвета фона и также стирание фрагментов текста в консоли. Для создания рамок была использована капелька хитрости.
Применение метода Крамера во всех примерах на ЯП С++ оказались гораздо точнее, но уступали в СЛУ размерностью 2x2 скоростью. В результате выполненной работы я пришел к аналогичному выводу (что и в результате с программой на Pascal) - программа неудобна для использования для решения СЛУ маленькой размерности, но при этом выигрывает для систем линейных уравнений, начиная с 3 порядка.
Программу дал опробовать нашим ровесникам и учителям нашей школы. В тестировании программы приняло участие 30 учащихся 8 – 10 классов и 7 учителей. От каждого услышал, что нужно добавить и, что нужно улучшить. Я всегда прислушиваюсь к советам пользователей и поэтому у меня часто появляются новые версии.
Экономический аспект включает: амортизацию компьютерной техники, электричество, оплату интернет-трафика. Бумагу, картридж, интернет, ПО – все предоставила школа (бесплатно).
Потребовались значительные временные затраты – с августа 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.
Здесь
= -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;
}