Задача А50. Даны действительные числа [latex]a_{1}[/latex], [latex]b_{1}[/latex], [latex]c_{1}[/latex], [latex]a_{2}[/latex], [latex]b_{2}[/latex], [latex]c_{2}[/latex]. Выяснить, верно ли что [latex]\left|a_{1} b_{2} -a_{2} b_{1} \right|\geq 0.0001[/latex], и если верно, то найти решение системы линейных уравнений
[latex]a_{1} x+b_{1} y+c_{1} =0[/latex],
[latex]a_{2} x+b_{2} y+c_{2} =0[/latex]
(при выполнении выписанного неравенства система заведомо совместна и имеет единственное решение).
[latex]a_{1}[/latex] | [latex]b_{1}[/latex] | [latex]c_{1}[/latex] | [latex]a_{2}[/latex] | [latex]b_{2}[/latex] | [latex]c_{2}[/latex] | [latex]x[/latex] | [latex]y[/latex] | Комментарий. |
3,8 | 5 | -2 | 6 | 8,4 | 3 | 16,5625 | -12,1875 | Тест пройден. |
0 | 4 | 5 | 2 | 0 | 9 | -4,5 | -1,25 | Тест пройден. |
1 | 2 | -3 | 3 | 2 | -1 | -1 | 2 | Тест пройден. |
1 | 0.00002 | 5 | 2 | 0.00005 | 8 | — | — | Тест не пройден. Неравенство не выполняется. |
1 | 4 | 5 | 2 | 8 | 3 | — | — | Тест не пройден. Неравенство не выполняется. |
Код программы (C++):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <stdio.h> #include <math.h> int main() { double a1, b1, c1, a2, b2, c2; // Переменные, предоставленные в условии. double x, y; // Переменные, которые нужно найти. double b0, c0; // Вспомогательные переменные. scanf ("%lf %lf %lf %lf %lf %lf", &a1, &b1, &c1, &a2, &b2, &c2); // Ввод данных с клавиатуры. if (fabs(a1*b2-a2*b1)>=0.0001) { if (a1!=0) { b0=b2-(b1/a1*a2); c0=-(c2-(c1/a1*a2)); y=c0/b0; x=(-c1-((b1*c0)/b0))/a1; printf ("x=%lf \ny=%lf \n", x, y); } else { b0=b1-(b2/a2*a1); c0=-(c1-(c2/a2*a1)); y=c0/b0; x=(-c2-((b2*c0)/b0))/a2; printf ("x=%lf \ny=%lf \n", x, y); } } else { puts ("Неравенство не выполняется."); } return 0; } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { double a1, b1, c1, a2, b2, c2, x, y, b0, c0; Scanner in = new Scanner (System.in); a1=in.nextDouble(); b1=in.nextDouble(); c1=in.nextDouble(); a2=in.nextDouble(); b2=in.nextDouble(); c2=in.nextDouble(); if (Math.abs(a1*b2-a2*b1)>=0.0001) { if (a1!=0) { b0=b2-(b1/a1*a2); c0=-(c2-(c1/a1*a2)); y=c0/b0; x=(-c1-((b1*c0)/b0))/a1; } else { b0=b1-(b2/a2*a1); c0=-(c1-(c2/a2*a1)); y=c0/b0; x=(-c2-((b2*c0)/b0))/a2; } System.out.format ("x=%f %ny=%f %n", x, y); } else { System.out.println("Неравенство не выполняется."); } } } |
По условию задачи необходимо решить систему линейных уравнений и вывести на экран [latex]x[/latex], [latex]y[/latex].
Программа решает это уравнение по методу Гаусса.
Изначально она делает проверку на наличие ненулевого аргумента [latex]a_{1}[/latex]. Если таковой имеется, то программа решает задачу, исходя из первого уравнения системы, в противном случае — решение начинается со второго уравнения.
Далее я ввела в программу переменные [latex]b_{0}[/latex], [latex]c_{0}[/latex], чтобы не перегружать формулы большим количеством данных. Алгоритм действий таков:
1) Перенести [latex]c_{1}[/latex] и [latex]c_{2}[/latex] в правую часть уравнения, что автоматически меняет их знак на противоположный.
2) Если в программе присутствует ненулевой аргумент [latex]a_{1}[/latex], то она вычитает из второго уравнения первое, предварительно домножив второе на [latex]\frac{b_{1} a_{2} }{a_{1} }[/latex].
3) Из преобразованного второго уравнения находится [latex]y[/latex], который впоследствии подставляется в первое уравнение системы для нахождения [latex]x[/latex] .
Для выполнения программы и проверки тестов можно воспользоваться следующим объектом (C++) и этим (Java).
Добавьте, пожалуйста, тест, в котором a1*b2-a2*b1 == 0, хотя значения a1, b1, a2, b2 не так уж и малы.
Первый тест довольно сложный, как считали ответ? Желательно добавить тесты, которые легче проверить устно.
После вывода значений желательно перевести строку (\n) — подписи вида «x=», «y=» тоже лишними не будут.
Тест добавлен.
Ответ считала на этом сайте. http://ru.onlinemschool.com/math/assistance/equation/gaus/
Также проверила его вручную на калькуляторе.
Вывод значений усовершенствован.
Спасибо за указания.
Засчитано, 10 баллов.
Попробовал на Вашем посте подсмотренную у Игоря Евгеньевича строчку, добавляющую полосу прокрутки в таблицу (чтобы она не налезала на правую колонку):
Можно не писать
Наверное, ideone автоматом ее прописывает — проверил, действительно так. Но спасибо за уточнение!
Засчитана Java версия.