#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, но мои опасения / проблемы заключаются в:
- Решается только первое уравнение (т. Е. A [0], B [0], C [0]), два других возвращают только начальные предположения о x1.
- Есть ли лучший способ достичь моей цели, поскольку зацикливание итератора в цикле 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)