http://www.voland-lab.com/files/other/KramerMax.exe Может кому надо.... Сорс: PHP: 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(); } } } }
фу.... всеголишь нужно написать функцию нахождения четности перестановки, и твоя прога станет !КОРОЧЕ! и будет считать матрицы любого размера n*n, n>2
Добавляешь рекурсивное вычесление определителя через разложение по столбцу/строке, будет короче и будет считать любые системы.
>>и будет считать любые системы. используя определение стандартное детерминанта, у тебя будет около n! вызовов, поэтому если и будет считать даже не большие системы, то очень долго.
"стандартное определение" это через инверсии и перестановки. Кстати nxn это не любая система, любая это nxm
>>"стандартное определение" это через инверсии и перестановки. разве на количество сложность алгоритма это как-то повлияет? >>Кстати nxn это не любая система, любая это nxm я пока не умею считать определитель матрицы 1x2
2 _Great_: при грамотной реализации сложность алгоритмов по нахождении четности перестановки и по разложению будет одна и та же - n! 2 DWORD: ой... прям профессор. я написал: любые матрицы n*n. это не n*m. Не пытайся сунуть умное слово, если некуда =/ 2 ZaCo +5
Ну вообще-то такие системы тоже решаются. 2Talisman, "любые" написал _Great_. Зачем так реагировать, никто никого не хочет обидеть.
Для метода Крамера нужны определители матриц. Определитель матрицы 1х2 можно посчитать путём ЭП . Хотя хз, может не прокатить, а проверять лень. Хотя даже если и прокатит, то будет намного длиннее Гаусса.
Определитель матрицы определен для квадратных матриц (см. определение Определителя матрицы). Эффективность метода Крамера практически равна 0. Лучше для реальных задач использовать Lu-факторизацию или факторизацию Холецкого.
на стока мне известно (хотя я мож уже и зыбал алгебру) Но определитель вроде бывает тока у матриц NxN aka квадратных.
Во первых нельзя юзать рекурсию , если у тебя сложность алгоритма нелинейная - утебя машина захлебнеться, если матрица будет больше чем 150, на 150. Тем более под делфи - там вообще наверное копеешные ресурсы. Полностью согласен Aag - я бы использовал метод Холесского, Ну или если проще - то метод гаусса, с выбором главного элемента по столбцу или по мтрице. А если писать на чем нить типа джавы - там лучше использовать метод ЛУ факторицации(ну и холееского конечно) - тк в виртуальной джава машине реализована аппаратное скалярное накопление - не будет впустую гонять. А холесский- его надо боьше оптимизировать.