PDA

Просмотр полной версии : Решение уравнений методом Крамера [c#]


[x26]VOLAND
17.10.2007, 10:47
http://www.voland-lab.com/files/other/KramerMax.exe
Может кому надо....
Сорс:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace KramerMax
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

float def(float[,] a) //находим определитель
{
float def;
def = a[1,1]*a[2,2]*a[3,3] + a[1,2]*a[2,3]*a[3,1] + a[2,1]*a[3,2]*a[1,3] - a[1,3]*a[2,2]*a[3,1] - a[1,2]*a[2,1]*a[3,3] - a[1,1]*a[2,3]*a[3,2];
return def;
}

private void button1_Click(object sender, EventArgs e)
{
xt.Text = "";
yt.Text = "";
zt.Text = "";
tssl.Text = "";

if (a11.Text == "" || a12.Text == "" || a13.Text == "" || a21.Text == "" || a22.Text == "" || a23.Text == "" || a31.Text == "" || a32.Text == "" || a33.Text == "")
{
tssl.Text = "Введены не все коэффициенты";
}
else
{
float[,] a = new float[4, 4];
a[1, 1] = float.Parse(a11.Text);
a[1, 2] = float.Parse(a12.Text);
a[1, 3] = float.Parse(a13.Text);
a[2, 1] = float.Parse(a21.Text);
a[2, 2] = float.Parse(a22.Text);
a[2, 3] = float.Parse(a23.Text);
a[3, 1] = float.Parse(a31.Text);
a[3, 2] = float.Parse(a32.Text);
a[3, 3] = float.Parse(a33.Text);
deftxt.Text = def(a).ToString();
}
}

private void button2_Click(object sender, EventArgs e)
{
tssl.Text = "";

if (a11.Text == "" || a12.Text == "" || a13.Text == "" || a21.Text == "" || a22.Text == "" || a23.Text == "" || a31.Text == "" || a32.Text == "" || a33.Text == "" || b1.Text == "" || b2.Text == "" || b3.Text == "")
{
tssl.Text = "Введены не все элементы уравнения";
}
else
{
float[,] A = new float[4, 4];
A[1, 1] = float.Parse(a11.Text);
A[1, 2] = float.Parse(a12.Text);
A[1, 3] = float.Parse(a13.Text);
A[2, 1] = float.Parse(a21.Text);
A[2, 2] = float.Parse(a22.Text);
A[2, 3] = float.Parse(a23.Text);
A[3, 1] = float.Parse(a31.Text);
A[3, 2] = float.Parse(a32.Text);
A[3, 3] = float.Parse(a33.Text);
float D = def(A);
deftxt.Text = D.ToString();

float[,] a = new float[4, 4];
a[1, 1] = float.Parse(b1.Text);
a[1, 2] = float.Parse(a12.Text);
a[1, 3] = float.Parse(a13.Text);
a[2, 1] = float.Parse(b2.Text);
a[2, 2] = float.Parse(a22.Text);
a[2, 3] = float.Parse(a23.Text);
a[3, 1] = float.Parse(b3.Text);
a[3, 2] = float.Parse(a32.Text);
a[3, 3] = float.Parse(a33.Text);
float Dx = def(a);

float[,] b = new float[4, 4];
b[1, 1] = float.Parse(a11.Text);
b[1, 2] = float.Parse(b1.Text);
b[1, 3] = float.Parse(a13.Text);
b[2, 1] = float.Parse(a21.Text);
b[2, 2] = float.Parse(b2.Text);
b[2, 3] = float.Parse(a23.Text);
b[3, 1] = float.Parse(a31.Text);
b[3, 2] = float.Parse(b3.Text);
b[3, 3] = float.Parse(a33.Text);
float Dy = def(b);

float[,] c = new float[4, 4];
c[1, 1] = float.Parse(a11.Text);
c[1, 2] = float.Parse(a12.Text);
c[1, 3] = float.Parse(b1.Text);
c[2, 1] = float.Parse(a21.Text);
c[2, 2] = float.Parse(a22.Text);
c[2, 3] = float.Parse(b2.Text);
c[3, 1] = float.Parse(a31.Text);
c[3, 2] = float.Parse(a32.Text);
c[3, 3] = float.Parse(b3.Text);
float Dz = def(c);

float x, y, z;
x = Dx / D;
y = Dy / D;
z = Dz / D;

xt.Text = x.ToString();
yt.Text = y.ToString();
zt.Text = z.ToString();
}
}
}
}

Talisman
17.10.2007, 13:29
фу.... всеголишь нужно написать функцию нахождения четности перестановки, и твоя прога станет !КОРОЧЕ! и будет считать матрицы любого размера n*n, n>2

_Great_
17.10.2007, 14:18
Добавляешь рекурсивное вычесление определителя через разложение по столбцу/строке, будет короче и будет считать любые системы.

ZaCo
17.10.2007, 14:41
>>и будет считать любые системы.
используя определение стандартное детерминанта, у тебя будет около n! вызовов, поэтому если и будет считать даже не большие системы, то очень долго.

DWORD
17.10.2007, 15:43
>>и будет считать любые системы.
используя определение стандартное детерминанта, у тебя будет около n! вызовов, поэтому если и будет считать даже не большие системы, то очень долго.
"стандартное определение" это через инверсии и перестановки.
Кстати nxn это не любая система, любая это nxm

ZaCo
17.10.2007, 16:32
>>"стандартное определение" это через инверсии и перестановки.
разве на количество сложность алгоритма это как-то повлияет?;)
>>Кстати nxn это не любая система, любая это nxm
я пока не умею считать определитель матрицы 1x2 :(

Talisman
17.10.2007, 16:56
2 _Great_ (member.php?u=21085):
при грамотной реализации сложность алгоритмов по нахождении четности перестановки и по разложению будет одна и та же - n!
2 DWORD (member.php?u=39346):
ой... прям профессор. я написал: любые матрицы n*n. это не n*m. Не пытайся сунуть умное слово, если некуда =/
2 ZaCo
+5

DWORD
17.10.2007, 22:49
я пока не умею считать определитель матрицы 1x2
Ну вообще-то такие системы тоже решаются.

2Talisman, "любые" написал _Great_. Зачем так реагировать, никто никого не хочет обидеть.

_Great_
17.10.2007, 23:18
Ну вообще-то такие системы тоже решаются.

2Talisman, "любые" написал _Great_. Зачем так реагировать, никто никого не хочет обидеть.
Этим методом - нет.

Ky3bMu4
18.10.2007, 20:56
Для метода Крамера нужны определители матриц. Определитель матрицы 1х2 можно посчитать путём ЭП . Хотя хз, может не прокатить, а проверять лень. Хотя даже если и прокатит, то будет намного длиннее Гаусса.

Aag
18.10.2007, 23:48
Определитель матрицы определен для квадратных матриц (см. определение Определителя матрицы).
Эффективность метода Крамера практически равна 0. Лучше для реальных задач использовать Lu-факторизацию или факторизацию Холецкого.

slesh
18.10.2007, 23:50
на стока мне известно (хотя я мож уже и зыбал алгебру) Но определитель вроде бывает тока у матриц NxN aka квадратных.

_Great_
19.10.2007, 10:44
Спор ниочём

Joker-jar
19.10.2007, 11:04
http://forum.antichat.ru/showpost.php?p=466177&postcount=644 - пробовал как-то искать определитель (рекурсия, делфи)

~Lexx~
19.10.2007, 12:40
http://forum.antichat.ru/showpost.php?p=466177&postcount=644 - пробовал как-то искать определитель (рекурсия, делфи)
Во первых нельзя юзать рекурсию , если у тебя сложность алгоритма нелинейная - утебя машина захлебнеться, если матрица будет больше чем 150, на 150. Тем более под делфи - там вообще наверное копеешные ресурсы.
Полностью согласен Aag - я бы использовал метод Холесского, Ну или если проще - то метод гаусса, с выбором главного элемента по столбцу или по мтрице. А если писать на чем нить типа джавы - там лучше использовать метод ЛУ факторицации(ну и холееского конечно) - тк в виртуальной джава машине реализована аппаратное скалярное накопление - не будет впустую гонять. А холесский- его надо боьше оптимизировать.