Метод простых итераций

		function matrixArray_iter(rows, columns, x) {
		var arr = new Array();
		for(var i = 0; i < rows; i++){
			arr[i] = new Array();
			for(var j = 0; j < columns; j++){
				switch (i) {
					case j:
						arr[i][j] = 0;
						break;
					default:
						arr[i][j] = -x[i][j] / x[i][i]; 
						break;
				}
		    }
		  }
	    return arr;
	}
	var siz = document.getElementsByTagName("input")[0];
	var build = document.getElementsByTagName("button")[0];
	build.onclick = function () {
		var x_in = new Array();
		var b_in = new Array();
		for (var i = 0; i < siz.value; i++) {
			var input = document.createElement("input");
			input.type = "text";
			input.placeholder ="Введите через пробел коэффициенты уравнения " + (i + 1);
			document.body.appendChild(input);
		}	
		var button = document.createElement("button");
		button.innerHTML = "Вычислить";
		document.body.appendChild(button);
		button.onclick = function () {
			for (var i = 0; i < siz.value; i++) {
				var int_x = document.getElementsByTagName("input")[i + 1];
				var arr_x = int_x.value.toString().split(" ");
				for (var j = 0; j < arr_x.length; j++) {
					arr_x[j] = parseFloat(arr_x[j]);
				}
				x_in[i] = new Array();
				for (var j = 0; j < arr_x.length - 1; j++) {
					x_in[i][j] = arr_x[j];
				}
				b_in[i] = arr_x[arr_x.length - 1]; /*заполнение оригинальных массивов*/
			}
			var c = new Array();
			for (var j = 0; j < b_in.length; j++) {
				c[j] = b_in[j] / x_in[j];
			}
			console.log(c);
			var b = matrixArray_iter(siz.value, siz.value, x_in);
			console.log(b);
		}	
	}

здравствуйте! я сейчас морочусь с написанием метода простых итераций на js. возникла небольшая проблема.я пытаюсь заполнить вектор с значениями. и вроде бы все сделал правильно. массивы для расчета значений вектора с пропарсил к флоатам, но мне все равно выдает результат NaN.
подскажите, пожалуйста, в чем может быть проблема. я каждый шаг написания кода дебажил, но это не дало никакого результата

похоже, меня не спасти… я понял, в чем была моя ошибка. я пытался разделить число на массив (забыл индекс приписать). боже, как тупо(

Ничего, все мы люди, ошибаемся. Главное правильно “выкрутиться” из любой ситуации, сделать так, чтобы стало лучше, а не хуже. Главное - конечный итог.

1 лайк
		function evklid (x) {
		var t = 0;
		var j = x.length - 1;
		for (var i = 0; i < j; i++) {
			t += Math.pow(x[j][i] - x[j - 1][i], 2);
			console.log("квадраты " + t);
		}
		console.log("iter");
		t = Math.sqrt(t);
		return t;
	}

image
я все еще пишу этот метод. посмотрите, пожалуйста, свежим взглядом, функция отражает формулу? (к в скобках это строка массива)

image

вот что мне выдает консоль. по идее так быть не должно, потому что это какая-то дичь (в каждом цикле количество результатов увеличивается). или я слишком туплю… подскажите, пожалуйста, что не так. уже мозги кипят

аргумент - двумерный массив. пробовал сделать аргумент одномерным массивом, но там нужно менять строку массива на -1, поэтому этот вариант отпадает

K начинается с 0 или с 1? (нумерация в массиве с 0 начинается). Но тогда k-1 = -1

к начинается с единицы.

вот еще кусок кода

var x = new Array(); /*массив решений*/
				var k = 0;
				var L;
				x[0] = new Array();
				x[0] = c;
				do {
					k++;
					x[k] = new Array();
					var x_t = calcul(b, x[k - 1], c);
					x[k] = x_t;
					L = evklid(x);
				} while (L >= 0.01);

Не понятно, как должна L вычисляться, для каждой k своя ?.. Вот мой код, но нужно еще до ума доводить.

function evklid(src) {
  for (var line = 0; line < src.length; line++) {
    var sum = 0;

    for (var elem = 0; elem < src[line].length; elem++) {
      sum += Math.pow(
        Math.pow(src[line][elem], line + 1) - Math.pow(src[line][elem], line), 2);
    }
  }

// ....

  return result;
}
1 лайк

ну вот например начало цикла. к = 1. создается новый двумерный массив х[1], соответственно в функции длина массива становится больше. и индексы меняются. (если я правильно понял, что вас смутило)
и так по очереди проводятся расчеты.

спасибо за функцию. посмотрю, доработаю немного

Можно “на ты”. Получается, что на выходе должен быть массив L-элементов, такой же длинны, как и k-массив?

на выходе должно быть число. а именно корень из суммы квадратов разниц элементов. как-то так

Не понятно. Можно фотку условия задачи? Есть вебка или на телефон сфоткать? Или перепиши.

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

и вот формулы по которым я искал элементы

в общем, я все еще раз подробно продебажил.
image
все считается как надо, только вот количество расчетов в каждом последующем цикле возрастает. и соответсвенно расчеты выходят за пределы массива и итерации останавливаются не закончив свою работу. я не понимаю почему так. я ж ограничитель поставил

	function evklid (x) {
		var t = 0;
		var j = x.length - 1;
		var i = 0;
		while (i < j) {
			t += Math.pow(x[j][i] - x[j - 1][i], 2);
			console.log("квадраты " + t + " = " + x[j][i] + "-" + x[j-1][i]);
			i++;
		}
		console.log("iter");
		t = Math.sqrt(t);
		return t;
	}

вот функция для расчета. она отличается от старой только тем, что цикл фор заменен на цикл вайл. думал заработает как надо, но абсолютно 0 разницы.

Я не смог найти такого куска кода который можно взять целиком запустить и увидеть проблему. Можешь кинуть такой код? Без конкретных значений не разобраться в чем проблема.

да все уже, решил проблему. я просто в функции evklid ставил ограничение не фиксированной длины (то бишь длины столбца), а длину строки, которая растет с каждой итерацией. а так все правильно решается.

1 лайк