Решение уравнений методом Крамера [c#]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by [х26]VОLАND, 17 Oct 2007.

  1. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    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 senderEventArgs 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[,] = new float[44];
                    
    a[11] = float.Parse(a11.Text);
                    
    a[12] = float.Parse(a12.Text);
                    
    a[13] = float.Parse(a13.Text);
                    
    a[21] = float.Parse(a21.Text);
                    
    a[22] = float.Parse(a22.Text);
                    
    a[23] = float.Parse(a23.Text);
                    
    a[31] = float.Parse(a31.Text);
                    
    a[32] = float.Parse(a32.Text);
                    
    a[33] = float.Parse(a33.Text);
                    
    deftxt.Text def(a).ToString();
                }
            }

            private 
    void button2_Click(object senderEventArgs 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[,] = new float[44];
                    
    A[11] = float.Parse(a11.Text);
                    
    A[12] = float.Parse(a12.Text);
                    
    A[13] = float.Parse(a13.Text);
                    
    A[21] = float.Parse(a21.Text);
                    
    A[22] = float.Parse(a22.Text);
                    
    A[23] = float.Parse(a23.Text);
                    
    A[31] = float.Parse(a31.Text);
                    
    A[32] = float.Parse(a32.Text);
                    
    A[33] = float.Parse(a33.Text);
                    
    float D def(A);
                    
    deftxt.Text D.ToString();

                    
    float[,] = new float[44];
                    
    a[11] = float.Parse(b1.Text);
                    
    a[12] = float.Parse(a12.Text);
                    
    a[13] = float.Parse(a13.Text);
                    
    a[21] = float.Parse(b2.Text);
                    
    a[22] = float.Parse(a22.Text);
                    
    a[23] = float.Parse(a23.Text);
                    
    a[31] = float.Parse(b3.Text);
                    
    a[32] = float.Parse(a32.Text);
                    
    a[33] = float.Parse(a33.Text);
                    
    float Dx def(a);

                    
    float[,] = new float[44];
                    
    b[11] = float.Parse(a11.Text);
                    
    b[12] = float.Parse(b1.Text);
                    
    b[13] = float.Parse(a13.Text);
                    
    b[21] = float.Parse(a21.Text);
                    
    b[22] = float.Parse(b2.Text);
                    
    b[23] = float.Parse(a23.Text);
                    
    b[31] = float.Parse(a31.Text);
                    
    b[32] = float.Parse(b3.Text);
                    
    b[33] = float.Parse(a33.Text);
                    
    float Dy def(b);

                    
    float[,] = new float[44];
                    
    c[11] = float.Parse(a11.Text);
                    
    c[12] = float.Parse(a12.Text);
                    
    c[13] = float.Parse(b1.Text);
                    
    c[21] = float.Parse(a21.Text);
                    
    c[22] = float.Parse(a22.Text);
                    
    c[23] = float.Parse(b2.Text);
                    
    c[31] = float.Parse(a31.Text);
                    
    c[32] = float.Parse(a32.Text);
                    
    c[33] = float.Parse(b3.Text);
                    
    float Dz def(c);

                    
    float xyz;
                    
    Dx D;
                    
    Dy D;
                    
    Dz D;

                    
    xt.Text x.ToString();
                    
    yt.Text y.ToString();
                    
    zt.Text z.ToString();
                }
            }
        }
    }
     
    1 person likes this.
  2. Talisman

    Talisman Elder - Старейшина

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    фу.... всеголишь нужно написать функцию нахождения четности перестановки, и твоя прога станет !КОРОЧЕ! и будет считать матрицы любого размера n*n, n>2
     
  3. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    Добавляешь рекурсивное вычесление определителя через разложение по столбцу/строке, будет короче и будет считать любые системы.
     
  4. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    >>и будет считать любые системы.
    используя определение стандартное детерминанта, у тебя будет около n! вызовов, поэтому если и будет считать даже не большие системы, то очень долго.
     
  5. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    "стандартное определение" это через инверсии и перестановки.
    Кстати nxn это не любая система, любая это nxm
     
  6. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    >>"стандартное определение" это через инверсии и перестановки.
    разве на количество сложность алгоритма это как-то повлияет?;)
    >>Кстати nxn это не любая система, любая это nxm
    я пока не умею считать определитель матрицы 1x2 :(
     
    1 person likes this.
  7. Talisman

    Talisman Elder - Старейшина

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    2 _Great_:
    при грамотной реализации сложность алгоритмов по нахождении четности перестановки и по разложению будет одна и та же - n!
    2 DWORD:
    ой... прям профессор. я написал: любые матрицы n*n. это не n*m. Не пытайся сунуть умное слово, если некуда =/
    2 ZaCo
    +5
     
  8. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Ну вообще-то такие системы тоже решаются.

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

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    Этим методом - нет.
     
  10. Ky3bMu4

    Ky3bMu4 Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    Для метода Крамера нужны определители матриц. Определитель матрицы 1х2 можно посчитать путём ЭП . Хотя хз, может не прокатить, а проверять лень. Хотя даже если и прокатит, то будет намного длиннее Гаусса.
     
  11. Aag

    Aag Elder - Старейшина

    Joined:
    26 Jul 2005
    Messages:
    60
    Likes Received:
    19
    Reputations:
    8
    Определитель матрицы определен для квадратных матриц (см. определение Определителя матрицы).
    Эффективность метода Крамера практически равна 0. Лучше для реальных задач использовать Lu-факторизацию или факторизацию Холецкого.
     
  12. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    на стока мне известно (хотя я мож уже и зыбал алгебру) Но определитель вроде бывает тока у матриц NxN aka квадратных.
     
  13. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    Спор ниочём
     
    1 person likes this.
  14. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    /showpost.php?p=466177&postcount=644 - пробовал как-то искать определитель (рекурсия, делфи)
     
  15. ~Lexx~

    ~Lexx~ Elder - Старейшина

    Joined:
    30 Sep 2006
    Messages:
    195
    Likes Received:
    28
    Reputations:
    0
    Во первых нельзя юзать рекурсию , если у тебя сложность алгоритма нелинейная - утебя машина захлебнеться, если матрица будет больше чем 150, на 150. Тем более под делфи - там вообще наверное копеешные ресурсы.
    Полностью согласен Aag - я бы использовал метод Холесского, Ну или если проще - то метод гаусса, с выбором главного элемента по столбцу или по мтрице. А если писать на чем нить типа джавы - там лучше использовать метод ЛУ факторицации(ну и холееского конечно) - тк в виртуальной джава машине реализована аппаратное скалярное накопление - не будет впустую гонять. А холесский- его надо боьше оптимизировать.
     
    1 person likes this.