PDA

Просмотр полной версии : Система линейных уравнений


Pluto
17.08.2007, 10:53
Помогите найти ява скрипт для решения систем линейных уравнений, заранее всем спасибо

Il_Burbero
17.08.2007, 12:58
Может еще ява скрипт для решения дифуров тебе нужен?
МАТЧАСТЬ!!!! (http://www.toehelp.ru/theory/math/lecture14/lecture14.html)

Без обид, но имхо это НЕ реально. Даже Маткад с матлабом иногда заносит если задать тупиковую систему, а тебе скрипт подавай. Ишь ты:))

1 Система может иметь единственное решение.
2. Система может иметь бесконечное множество решений. Например, . Решением этой системы является любая пара чисел, отличающихся знаком.
3. Система вообще не имеет решения. Например, , если бы решение существовало, то x1 + x2 равнялось бы одновременно нулю и единице.

ST.RIKE, без обид, но прежде чем просить что то ты изучи матчасть для начала.

Pluto
17.08.2007, 14:10
То есть на любом языке программирования можно написать прогу, которая решает систему уравнений, а ява этого сделать не в силах?
Я даже на vbs нашел метод Гаусса..

czukowski
17.08.2007, 17:31
Il_Burbero, да все реально, хотя и посложнее, чем в матлабе, тут спору нет :)
Имхо, создать класс Матрица, который будет уметь применять Гаусса, плюс, тесты на решаемость (сравнить ранги). Потом, если надо, можно наращивать и в конце вообще получить матлаб на яваскрипте :)
Я даже на vbs нашел метод Гаусса..
Ну так просто перевести :)

Il_Burbero
17.08.2007, 19:46
czukowski, я не спорю, это да. Но это уже будет не скрипт:) а программа на яве. Улавливаете разницу?:)))
Дело еще в системе уравнений (количество переменных (а если они еще и комплексные...) и размер системы и как следствие количество решений) и в наборе встроенных математических функций языка.

Кстати ST.RIKE я нашел, правда явы там нет (ява не в почете у прогеров-математиков:) видно слабовата у нее математика) зато ты можешь посмотреть примеры на других языках. В т.ч. и на vbs. Там есть АЛГОРИТМ а это решение для любого языка.
ЗДЕСЬ...... (http://alglib.sources.ru/linequations/general/)

А да, я вспомнил почему еще ввязался в спор. Здесь же Java Script! Даже не Java (это немножко разные вещи, не так ли?)
Так что ИМХО скрипт для решения ЛУ (больше трех переменных и размером больше четырех уравнений) на Java Script практически нереальная задача.
Даже если вы ее решите она "будет жрать ресурсы компа как Ктулху!" (с)не мое

czukowski
17.08.2007, 21:27
Так что ИМХО скрипт для решения ЛУ (больше трех переменных и размером больше четырех уравнений) на Java Script практически нереальная задача.
Не слишком же ты хорошего о нем мнения :) Мне сдается, что это больше от компа зависит, чем от языка.
Ну если прикинуть: приведение матрицы к Эрмитовой нормальной форме - грубо говоря, операций много, но сплошной + и *, потом переменные, где единицы выразить с помощью остальных, подставив вместо них параметры (вот тут наверное будут подводные камни, с точки зрения алгоритмизации), ну и отсюда получаем прямиком множество решений с параметрами (если устроит такая запись решения). В общем, имхо, до 10*10 решать будет в приемлемое время.

з.ы.: Если ST.RIKE решится сделать, то можно будет и проверить :)

Il_Burbero
17.08.2007, 23:27
czukowski, дело не в мнении (я хорошего мнения о Ява Скрипт для WEB замутов - это просто и дельно). Ява скрипт очень полезен, спору нет.
Но решать ЛУ через Ява скрипты имхо красить километровый забор зубной щеткой. Ибо очень мудренный подход к ресурсам машины (через браузер и компилятор Java подгружаясь в оперативку и только потом вычисляясь попутно загружая кэш!).
А в Маткаде это решается задачей двух матриц и функцией lsolve (матрица констант переменных, матрица констант). Прямо через мозг, быстро.

:) Вы еще решите ЛУ на стороне сервера, вот хостеру будет щастье:))

czukowski
18.08.2007, 21:00
В общем, я тебе не поверил :) и вот что выяснил:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>

</head>
<body bgcolor="#ffffff">


<div id="workspace">

</div>
<a href="#" onClick="print_matrix(out, hermite(A));return false;">click</a>


<script type="text/javascript">
var A=[[1, 2, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 3, 4, 1, 111, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 61, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 65, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 2, 4, 1, 1, 1, 4, 1, 51, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 81, 1, 1, -4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 98, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 54, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 23, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, -1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 12, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 19, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, -1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 31, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 91, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 32, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 34, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4],
[1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4]];
var out = document.getElementById("workspace");
print_matrix(out, A);

function print_matrix(element, m)
{
for (var i = 0; i < m.length; i++)
{
for (var j = 0; j < m.length; j++)
{
element.innerHTML += m[i][j] + ' ';
}
element.innerHTML += '<br />';
}
element.innerHTML += '<br />';
}

function hermite(A)
{
var m = 0, n = 0;
try
{
m = A.length;
n = A[0].length;
}
catch(e)
{
m = 0;
n = 0;
}
if (m == 0 || n == 0)
{
return false;
}

for (var g = 0, h = 0; g < m; g++, h++)
{
var currentRow = A[g];
if (A[g][h] == 0)
{
for (var i = g + 1; i < m; i++)
{
if (A[i][h] != 0)
{
A[g] = A[i];
A[i] = currentRow;
break;
}
}
if (i == m)
{
g--;
continue;
}
}
for (var i = g; i < m; i++)
{
var k = A[i][h];
if (k != 0)
{
for (var j = h; j < n; j++)
{
A[i][j] = A[i][j] / k;
}
}
}
for (var i = g + 1; i < m; i++)
{
if (A[i][h] != 0)
{
for (var j = h; j < n; j++)
{
A[i][j] = A[i][j] - A[g][j];
}
}
}
for (var i = 0; i < g; i++)
{
var k = A[i][h];
if (k != 0)
{
for (var j = h; j < n; j++)
{
A[i][j] = A[i][j] - k * A[g][j];
}
}
}
}
return A;
}
</script>

</body>
</html> (вместе с хтмл, для удобства копи-паста :)) приводит очень некрасивую мартицу размером 40х20 к Эрмитовой нормальной форме менее, чем за секунду (и потом две-три секунды 1 0 0 4 0 0 0 4 1 0 0 4 1 0 1 4 1 1 1 4 1 1 1.0909090909090908 4 0 1 0 4 -0.6000000000000085 0 1 4.160000000000001 1 1 1 4 1 1 1 4
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.09090909090909091 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.6 0 0 -0.16 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 выписывает, но это из-за медленной функции выписи, с которой уже не хотелось возиться).

Оно ясно, что маткад по-любому лучше для таких задач, но его-то к веб-странице ну никак не прикрутить, согласись :)

Вы еще решите ЛУ на стороне сервера, вот хостеру будет щастье)
На хосте вообще ничего запускать нельзя (даже более-менее посещаемый форум), из-за их дурацких условий про нагрузку.

ST.RIKE, почти пол-дела уже сделано, осталось тебе только вытащить отсюда ответ :)

[I]Добавлено через 16 минут
Il_Burbero, нагрузка на комп: :)
http://aycu32.webshots.com/image/26391/2000510558274770116_rs.jpg
1) Запуск браузера
2) Открытие страницы (при этом выписывается начальная матрица)
3) Нажатие кнопки вычисления

Вот, а я сначала было поддался твоим настроениям и написал выше про 10х10, хотя сам до этого думал о 100х100 (правда, тоже с потолка, никогда не занимался измерением производительности яваскрипта) :razz:

Il_Burbero
18.08.2007, 23:51
czukowski, ну ты ваще... Нельзя так.:)
Хорошо убедил. Все равно хотелось бы посмотреть конечный скрипт:) и сделать окончательные выводы.
Я var A=[[0, 2, 1, 4, 1, 1, 1, 4, 0, 4],
[1, 0, 3, 4, 1, 1, 1, 0, 1, 0],
[1, 1, 0, 4, 1, 1, 0, 4, 1, 1],
[1, 6, 1, 0, 1, 0, 1, 4, 1, 3],
[1, 1, 1, 4, 0, 1, 1, 4, 1, 0.3]]; матрицу, подправил числа и получил ошибку сценария на 59 строке. Ламеры рулят! Защита от дурачка не сработала.

czukowski
19.08.2007, 12:15
Il_Burbero, Вот почему тестировать и надо :) Это не от дурачка защита, а "очепятка" - я почему-то подумал, что цикл будет идти при выполнении обоих условий, вследствие чего последний попытался выйти за пределы матрицы :) Ну ладно, одно из условий оказалось ненужное, его и выкинул :) (исправил пост выше).
Все равно хотелось бы посмотреть конечный скрипт и сделать окончательные выводы.
Э-не, мне просто было интересно, насколько быстро сработает скрипт на Javascript-е, надеюсь, ты согласишься, что это была самая затратная часть? Так что если хочешь посмотреть, тебе и карты в руки :) Тем более, что я не совсем себе представляю, как это сделать. Думается, если скрипт при проходе матрицы будет делать список главных столбцов, то потом можно переменные в них выразить с помощью остальных, замененных на параметры.
А ведь еще нужно ввод от юзера сделать, тут уже и защита от дурачков понадобится... :)