Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Решение уравнений методом Крамера [c#] |

17.10.2007, 10:47
|
|
Moderator - Level 7
Регистрация: 07.06.2006
Сообщений: 556
Провел на форуме: 7549607
Репутация:
2702
|
|
Решение уравнений методом Крамера [c#]
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();
}
}
}
}
|
|
|

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

17.10.2007, 14:18
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Добавляешь рекурсивное вычесление определителя через разложение по столбцу/строке, будет короче и будет считать любые системы.
|
|
|

17.10.2007, 14:41
|
|
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме: 4610226
Репутация:
1332
|
|
>>и будет считать любые системы.
используя определение стандартное детерминанта, у тебя будет около n! вызовов, поэтому если и будет считать даже не большие системы, то очень долго.
|
|
|

17.10.2007, 15:43
|
|
Участник форума
Регистрация: 24.07.2007
Сообщений: 138
Провел на форуме: 165671
Репутация:
215
|
|
Сообщение от ZaCo
>>и будет считать любые системы.
используя определение стандартное детерминанта, у тебя будет около n! вызовов, поэтому если и будет считать даже не большие системы, то очень долго.
"стандартное определение" это через инверсии и перестановки.
Кстати nxn это не любая система, любая это nxm
|
|
|

17.10.2007, 16:32
|
|
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме: 4610226
Репутация:
1332
|
|
>>"стандартное определение" это через инверсии и перестановки.
разве на количество сложность алгоритма это как-то повлияет?
>>Кстати nxn это не любая система, любая это nxm
я пока не умею считать определитель матрицы 1x2 
|
|
|

17.10.2007, 16:56
|
|
Постоянный
Регистрация: 22.04.2006
Сообщений: 566
Провел на форуме: 1325772
Репутация:
517
|
|
2 _Great_:
при грамотной реализации сложность алгоритмов по нахождении четности перестановки и по разложению будет одна и та же - n!
2 DWORD:
ой... прям профессор. я написал: любые матрицы n*n. это не n*m. Не пытайся сунуть умное слово, если некуда =/
2 ZaCo
+5
|
|
|

17.10.2007, 22:49
|
|
Участник форума
Регистрация: 24.07.2007
Сообщений: 138
Провел на форуме: 165671
Репутация:
215
|
|
я пока не умею считать определитель матрицы 1x2
Ну вообще-то такие системы тоже решаются.
2Talisman, "любые" написал _Great_. Зачем так реагировать, никто никого не хочет обидеть.
|
|
|

17.10.2007, 23:18
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Сообщение от DWORD
Ну вообще-то такие системы тоже решаются.
2Talisman, "любые" написал _Great_. Зачем так реагировать, никто никого не хочет обидеть.
Этим методом - нет.
|
|
|

18.10.2007, 20:56
|
|
Постоянный
Регистрация: 03.02.2007
Сообщений: 520
Провел на форуме: 1777536
Репутация:
932
|
|
Для метода Крамера нужны определители матриц. Определитель матрицы 1х2 можно посчитать путём ЭП . Хотя хз, может не прокатить, а проверять лень. Хотя даже если и прокатит, то будет намного длиннее Гаусса.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|