Другие языки программирования и технологии

Как в Microsoft Visual Studio 2010 решить в СиШарпе и Windows Forms Решить матрицу методом Крамера и получить ответвнизу

И правильно ли написан у меня код. Я новичок в этом деле. Смотрите пример в картинке и должно совпадать с ответами.

Код программы для матрицы:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication_Kramer
{
class Program
{
static void Main(string[] args)
{
int n; /* количество уравнений */
double [,] A = new double [3,3]; /* матрица системы */
double [] b = new double [3]; /* вектор правых частей */
double [] x = new double [3]; /* вектор решения */
char qq;
Console.Write("Введите количество уравнений (<=3) n -> ");
n = Convert.ToInt32(Console.ReadLine());
if (n > 3 || n <= 1)
{
Console.WriteLine("Ошибка в размерности системы (n=2,3)");
Convert.ToInt32(Console.ReadLine());
return;
}
for(int i=0; i<n; i++)
for(int j=0; j ",i,j);
A[i,j] = Convert.ToDouble(Console.ReadLine());
}
for(int i=0; i ", i);
b[i] = Convert.ToDouble(Console.ReadLine());
}
if(SLAU_kramer(n,A, b, x)==1)
{
Console.WriteLine("Система не имеет решение");
Convert.ToInt32(Console.ReadLine());
return;
}
else
for(int i=0; i<n; i++)
Console.WriteLine("x"+i+" = "+x[i]);
Console.ReadLine();
}
private
static double det(int n, double [,]B)
{
if (n == 2)
return B[0,0] * B[1,1] - B[0,1] * B[1,0];
return B[0,0] * (B[1,1] * B[2,2] - B[1,2] * B[2,1]) - B[0,1] * (B[1,0] * B[2,2] - B[1,2] * B[2,0])+
B[0,2]*(B[1,0] * B[2,1] - B[1,1] * B[2,0]);
}
static void equal(int n, double [,]A, double [,]B)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
A[i,j]=B[i,j];
}
static void change(int n, int N, double[,] A, double[] b)
{
for(int i=0; i<n; i++)
A[i,N]=b[i];
}
public
static int SLAU_kramer(int n, double[,] A, double[] b, double[] x)
{
double [,]An = new double [3,3];
double det1 = det(n, A);
if (det1 == 0) return 1;
for (int i = 0; i < n; i++)
{
equal(n, An, A);
change(n, i, An, b);
x[i] = det(n, An) / det1;
}
return 0;
}
}
}
Aleksander I
Aleksander I
40
Написать программу нахождения корней системы линейных уравнений, с использованием одного из описанных выше методов решения (точность установить до второго знака после запятой). Тестовый
пример правильности работы программы представлен здесь....

https://www.cyberforum.ru/windows-forms/thread1734908.html
НН
Неизвестно Неизвестно
71 252
Лучший ответ
Программа ВЫГЛЯДИТ правильной.
Вот только решение "в лоб" и только для систем из 2х и 3х уравнений.

Для метода Крамера решения систем с большим количеством уравнений есть несколько базовых приёмов:

1. Определители считаются методом Гаусса, приводя матрицу к треугольному виду, так как сложность нахождения определителя = O(n^3), соответственно общая сложность нахождения всех решений - O(n^4)

2. Считать определители в общем виде не требуется, нужно искать ОТНОШЕНИЕ определителей матриц, отличающихся на 1 столбец. Если этот отличающийся столбец одновременно поменять местами с последним, то определители в числителе и знаменателе поменяют поменяют знак также одновременно, а отношение определителей не изменится. Если также синхронно приводить матрицы в числителе и знаменателе к треугольному виду, то получатся диагонали, отличающиеся на одно число. Отношение этих чисел и есть отношение определителей. Можно заметить, что за исключением последнего столбца, треугольные матрицы равны. То есть реально нужно приводить к треугольному виду матрицу + столбец.
Этот пункт сильно влияет на производительность, хотя сложность останется O(n^4), но с другим коэффициентом. Кроме того существенно снижаются риски вещественного переполнения с потерей точности.

3. Также можно заметить, что у разных корней треугольные матрицы будут тоже похожи. Путём хитрых манипуляций можно на основании этой похожести снизить сложность вычисления до O(log(n)*n^3)

4. Ken Habgood и Itamar Arel в 2010 году выпустили работу, в которой сложность удалось понизить до O(n^3), но я лично этот метод не проверял
Павел Викторов
Павел Викторов
11 112