Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь с матрицами и массивами! 
:(
    Опции темы
Gravy07
  Дата 10.10.2011, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 10.10.2011

Репутация: нет
Всего: нет



Помогите с методом Гаусса-Зейделя, есть код на С++ и его нужно переписать на javascript как-нить, очень нуждаюсь в помощи:
Код

// Условие сходимости
bool converge(double *xk, double *xkp)
{
    for (int i = 0; i < n; i++) 
    {
        if (fabs(xk[i] - xkp[i]) >= eps) 
            return false;
    }
    return true;
}
 
/*
    Ход метода, где:
    a[n][n] - Матрица коэффициентов
    x[n], p[n] - Текущее и предыдущее решения
*/
 
do
{
    for (int i = 0; i < n; i++)
    {
        double var = 0;
        for (int j = 0; j < n; j++)
            if (j != i) var += (a[i][j] * x[j]);
        p[i] = x[i];
        x[i] = (b[i] - var) / a[i][i];
    }
}
while (!converge(x, p));


Вот код html файла, там для нескольких матриц порядка от 3 до 13:
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Численные методы</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>
    <!-- <script type="text/javascript" src="jquery-1.6.4.min.js"></script> -->
    <script type="text/javascript" src="tabs.js"></script>
    <script type="text/javascript" src="Javascr.js"></script>
  
</head>

<body>

<div class="section vertical">

    <ul class="tabs">
        <li class="current">Ввод матрицы</li>
        <li>Вторая вкладка</li>
        </ul>

     <div class="box visible">
        Выберите порядок квадратной матрицы
        <select id="webmenu" name="webmenu">
    <option value="0"></option>
    <option value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
    <option value="6">6</option>
    <option value="7">7</option>
    <option value="8">8</option>
    <option value="9">9</option>
    <option value="10">10</option>
    <option value="11">11</option>
    <option value="12">12</option>
    <option value="13">13</option>
</select>

       <div id="matrix"></div>
    </div>

    <div class="box">
        <p>Метод Гаусса-зейделя</p>
        </div>

</div>

</body>
</html>

и вот JS с созданием матрицы, мб надо было через массив, но не получилось:
Код

$(document).ready(function () {
    $('#webmenu').change(function () {
        var n = $(this).val()
        var t, r, i, j, c, b, v
        $('#matrix').empty()
        
        t = $('<table border="0" cellspacing="12" cellpadding="12"></table>')
        v = $('<table border="0" cellpadding="12" cellspacing="12"></table>')
        for (i = 0; i < n; i++) {
            r = $('<tr></tr>')
            for (j = 0; j < n; j++) {
                c = $('<td>' + Math.round(Math.random() * 51) + '</td>')
                r.append(c)
            }
            b = $('<tr>' + Math.round(Math.random() * 51) + '</tr>')
            v.append(b)
            t.append(r)
        }
        
        $('#matrix').append(t)
        $('#matrix').append(v)
 
    })
})

PM MAIL   Вверх
magelan
Дата 11.10.2011, 11:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 2
Всего: 16



как же жиквери народу мозг засирает, просто ужас.
учите JS в оригинале.

Код

<!DOCTYPE html>
<html>
    <head>
        <title>Gauss–Seidel method</title>
    </head>
    <style type="text/css">
        BODY {
            font-family: monospace; 
            height: 12px; 
            line-height: 14px
        }
    </style>
<body>
<script type="text/javascript">
var EXACTNESS = 0.001;
var MATRIX_SIZE = 3; 

var printMatrix = function( a )
{
    var n = a.length;
    var out = '';
    for( var i = 0; i < n; i++ )
    {
        out += '| '
        for( var j = 0; j < a[ i ].length; j++ )
            out += ( a[ i ][ j ] < 10 ? '&nbsp;' : '' )  + a[ i ][ j ] + ' ';
        out += '|<br />';
    }
    document.write( out  );
}
var printVector = function( pstr, v )
{
    var n = v.length;
    var out = pstr +  '| '
    for( var i = 0; i < n; i++ )
        out += Math.floor( v[ i ] * 1000 ) / 1000 + ' ';

    document.write( out + '|' );
}

var a = []; // создаем матрицу
for( var i = 0; i < MATRIX_SIZE; i++ )
{
    a[ i ] = []; // заполняем матрицу случайными значениями
    for( var j = 0; j < MATRIX_SIZE; j++ )
        a[ i ][ j ] = Math.round( Math.random() * 51 );
}

printMatrix( a );

var x = [];
var b = [];    // вектор b должен вычислятся или задаваться, вам виднее как...
for( var i = 0; i < MATRIX_SIZE; i++ ) // обнуляем вектор b
    b[ i ] = 0;
for( var i = 0; i < MATRIX_SIZE; i++ ) // "объединичиваем" вектор x
    x[ i ] = 1;

var v, m, break_count = 0;


    do
    {
        m = 0;
     for( var i = 0; i < MATRIX_SIZE; i++ )
        {
         var s = 0;
         for( var j = 0; j < MATRIX_SIZE; j++ )
             if( j != i ) 
                    s += a[ i ][ j ] * x[ j ];
            v = x[ i ];
         x[ i ] = ( b[ i ] - s ) / a[ i ][ i ];
         m = Math.abs( x[ i ]) - Math.abs( v )
        }
        if( break_count++ >= 1000 )
         break;
    }
    while( m < EXACTNESS );

    if( break_count == 1001 )
        document.write( '<br/>solve is absent' );
    else
        printVector( '<br/>solve: ', x );
</script>

</body>
</html>

PM MAIL   Вверх
Gravy07
Дата 14.10.2011, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 10.10.2011

Репутация: нет
Всего: нет



Большое спасибо! 
Только один вопрос, я не понял что делается в этой части кода и ля чего он?
Код

if( break_count++ >= 1000 )
         break;
    }
    while( m < EXACTNESS );

    if( break_count == 1001 )
        document.write( '<br/>solve is absent' );
    else
        printVector( '<br/>solve: ', x );

PM MAIL   Вверх
magelan
Дата 15.10.2011, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 2
Всего: 16



Т. К. Матрица создается случайным образом она может не обладать нужными свойствами сходимости в диапазоне решений. Поэтому если через 1000 шагов мы все еще не начали решаться, то прекращаем это делать. Иначе зависнет браузер. 
PM MAIL   Вверх
Gravy07
Дата 17.10.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 10.10.2011

Репутация: нет
Всего: нет



Спасибо, разобрался теперь smile
PM MAIL   Вверх
Gravy07
Дата 23.10.2011, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 10.10.2011

Репутация: нет
Всего: нет



Столкнулся с проблемой, что он выводит иногда в ответе вектор Х, в котором некоторые значения Infinity, -Infinity, NaN. Добавил в выводе ответа if ( в function printVector(pstr, v) { ) , но почему то не работает :( Подскажите, что не так..
Код

$(document).ready(function () {
 
    $('#webmenu').change(function () {
        var start = new Date()
        var exact = 0.01        
        var matrix_size = $(this).val()
        $('#matrix').empty()
        $('#vectorB').empty()
        //   $('#otvet').empty()
        
        var printMatrix = function (a) {
            var n = a.length
            var out = ''
            for (var i = 0; i < n; i++) {
                out += '| '
                for (var j = 0; j < a[i].length; j++)
                    out += (a[i][j] < 10 ? '&nbsp;' : '') + a[i][j] + ' '
                out += '|<br />'
            }
         
            $('#matrix').append('матрица А:<br><br>', out)

        }
        var printVectorB = function (b) {
            var n = b.length
            var out = ''

            for (var i = 0; i < n; i++) {
                out += '| '

                out += (b[i] < 10 ? '&nbsp;' : '') + b[i] + ' '
                out += '|<br />'
            }
             $('#vectorB').append('<br>вектор В:<br><br>' + out)
        }


        function printVector(pstr, v) {
            var n = v.length
            var out = pstr + '| '
            var status = document.getElementById("status");
            for (var i = 0; i < n; i++)
                out += Math.floor(v[i] * 1000) / 1000 + ' '
// [size=8]ТУТ!!! [/size]      
  
  if (isNan(out)) {
                 alert('Not a number')
                break 
            } else {
                if (isFinite(out)) status.innerHTML = out + '|'
                else alert('Infinity!!')
                }
                
            status.innerHTML = out + '|'
            //   document.write(out + '|')
            // $('#otvet').append(out + '|')
            
        }
//

        var a = [];
        for (var i = 0; i < matrix_size; i++) {
            a[i] = []
            for (var j = 0; j < matrix_size; j++)
                a[i][j] = Math.round(Math.random() * 51)
        }

        printMatrix(a)

        var x = []
        var b = []    // вектор b
        for (var i = 0; i < matrix_size; i++)
            b[i] = Math.round(Math.random() * 51)
        for (var i = 0; i < matrix_size; i++)
            x[i] = 1

        printVectorB(b)



        var v, m, break_count = 0
 

        do {

            m = 0
             for (var i = 0; i < matrix_size; i++) {
                var s = 0
                for (var j = 0; j < matrix_size; j++)
                    if (j != i)
                        s += a[i][j] * x[j]
                    v = x[i]
                    x[i] = (b[i] - s) / a[i][i]
                    m = Math.abs(x[i]) - Math.abs(v)
                   
                }
               if (break_count++ >= 1000)
                    break
            
            }
             
            while (m < exact) 
            if (break_count == 1001)
                printVector('<br>Решения нет')
            //   $('#otvet').append('<br/>Решения нет')
            else
                printVector('<br>Ответ: ', x)

           

            var end = new Date()
          function speed_time() {
                var speed = document.getElementById('speed')
                speed.innerHTML = 'Время выполнения: ' + (end.getTime() - start.getTime()) + ' мс'
          }
        })
    })
   


Это сообщение отредактировал(а) Gravy07 - 23.10.2011, 19:13
PM MAIL   Вверх
magelan
Дата 24.10.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 2
Всего: 16



тут типа строка собирается
Код

for (var i = 0; i < n; i++)
    out += Math.floor(v[i] * 1000) / 1000 + ' '


если вы во время вывода хотите алерты кидать - это плохая идея, на матрице 50 на 50 - заколебет, разумнее в вывод добавить что-то другое, например так:
Код

for (var i = 0; i < n; i++)
    if( badNumber( v[i] ))
    {
        out += ' дальше плохие ответы';
        break;
    }
    else
        out += Math.floor(v[i] * 1000) / 1000 + ' ';

функцию определяющую, что число не подходит сами нарисуете?

PM MAIL   Вверх
Gravy07
Дата 24.10.2011, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 10.10.2011

Репутация: нет
Всего: нет



не понял, что такое badNumber? функция?
PM MAIL   Вверх
magelan
Дата 24.10.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 2
Всего: 16



да. Возвращает false если с числом все хорошо, или true - если число неправильное.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1102 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.