Использование решателя Ньютона-Рафсона для системы уравнений с одной переменной в Javascript

#javascript #arrays #for-loop #do-while #newtons-method

#javascript #массивы #for-цикл #do-while #метод ньютонов

Вопрос:

Я хочу решить уравнение вида ax ^ 2 -bx c для различных значений определенных параметров a, b и c в одномерных массивах A, B и C соответственно.

 const A = [1, 1, 1]
const B = [5, 3, 2];
const C = [4, 2, 1];
var i = 0
var x0 = [10, 12, 11];
var x1 = [];
var fx = [];
var fxp = [];
const tol = [0.1, 0.1, 0.1]
for (let j = 0; j < A.length; j  ) {
    do {
        x1[j] = x0[j];
        fx[j] = A[j] * x1[j] * x1[j] - B[j] * x1[j]   C[j]; //function 
        fxp[j] = 2 * A[j] * x1[j] - B[j]; //first derivative of f(x)
        x0[j] = x1[j] - fx[j] / fxp[j];
        i  
        if (i > 100) break;
    } while (x0[j] - x1[j] < tol[j])
}

console.log("x1", x1)  

Я поместил итератор цикла do-while в цикл for, но мои опасения / проблемы заключаются в:

  1. Решается только первое уравнение (т. Е. A [0], B [0], C [0]), два других возвращают только начальные предположения о x1.
  2. Есть ли лучший способ достичь моей цели, поскольку зацикливание итератора в цикле for может быть дорогостоящим с точки зрения вычислений, когда A.длина >>> большая?

Комментарии:

1. Что такое x0 , x1 , fx fxp и tol ? Какова цель if (i > 100) break; ? Какова на самом деле взаимосвязь между A , B и C ?

2. fx — это функция, корень (ы) которой должен быть определен, fxp — это первая производная от fx, x0 — начальное предположение о корне, но оно обновляется после каждой итерации, x1 — это корень, tol — значение допуска. Я ставлю if (i > 100) break, чтобы поставить break, когда итерация превышает 100

3. В данном случае B = [5, 3, 2] правильно ли это: a = 5; b = 3; c = 2 ?

4. Существует три уравнения, коэффициенты находятся в массивах A, B, C. Таким образом, все a находятся в массиве A, b — в массиве B и c — в массиве C. Таким образом, уравнения: (1) 1x ^ 2-5x 4 (2) 1x ^ 2-3x 2 (3) 1x ^ 2-2x 1

5. @YongQuan В данном случае я использовал только три уравнения, но это может быть n-число уравнений.

Ответ №1:

Код разработан для квадратного уравнения, но может быть легко адаптирован к другим уравнениям, при условии, что вы получите первую производную уравнения. «fx» — это функция, а «fxp» — первая производная.

Система Newton-Raphson очень чувствительна к инициализации, как показано в этом примере; и для квадратичных функций с двумя корнями вы получите две разные в зависимости от начального values…so тщательно выбирайте начальные значения.

 //CASE ONE
const A = [1, 1, 1]
const B = [5, 3, 2];
const C = [4, 2, 1];
var x0 = [14, 13, 11];
var x1 = [14, 13, 11];
var fx = [];
var fxp = [];
const tol = [0.000001, 0.000001, 0.000001]
const error = [];
for (i = 0; i < 1000; i  ) {
    for (let j = 0; j < A.length; j  ) {
        x1[j] = x0[j];
        fx[j] = A[j] * x1[j] * x1[j] - B[j] * x1[j]   C[j]; //function 
        fxp[j] = 2 * A[j] * x1[j] - B[j]; //first derivative of f(x)
        x0[j] = x1[j] - fx[j] / fxp[j];
        error[j] = Math.abs(x1[j] - x0[j]);
        if (error[j] < tol[j]) {
            break;
        }
    }
}

console.log("x1", x1, "error", error)  

 //CASE TWO
const A = [1, 1, 1]
const B = [5, 3, 2];
const C = [4, 2, 1];
var x0 = [0, 0, 0];
var x1 = [0, 0, 0];
var fx = [];
var fxp = [];
const tol = [0.000001, 0.000001, 0.000001]
const error = [];
for (i = 0; i < 1000; i  ) {
    for (let j = 0; j < A.length; j  ) {
        x1[j] = x0[j];
        fx[j] = A[j] * x1[j] * x1[j] - B[j] * x1[j]   C[j]; //function 
        fxp[j] = 2 * A[j] * x1[j] - B[j]; //first derivative of f(x)
        x0[j] = x1[j] - fx[j] / fxp[j];
        error[j] = Math.abs(x1[j] - x0[j]);
        if (error[j] < tol[j]) {
            break;
        }
    }
}

console.log("x1", x1, "error", error)