Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const E = 0.1;
- function Vec2(x1, x2) {
- this.x1 = x1;
- this.x2 = x2;
- }
- const calcMatrix = (m, s) => {
- return [[m[0][0](s), m[0][1](s)], [m[1][0](s), m[1][1](s)]];
- };
- const calcInversed = (m) => {
- const k = 1.0 / (m[0][0] * m[1][1] - m[0][1] * m[1][0]);
- return [[k * m[1][1], -k * m[0][1]], [-k * m[1][0], k * m[0][0]]];
- };
- const f = (p) =>
- 2.0 * Math.pow(p.x1, 4) +
- Math.pow(p.x2, 4) +
- Math.pow(p.x1, 2) * p.x2 -
- 5.0 * p.x1 * p.x2 +
- 3 * Math.pow(p.x1, 2) +
- Math.pow(p.x2, 2) +
- 8 * p.x2;
- const grad = (p) =>
- new Vec2(
- 8.0 * Math.pow(p.x1, 3) + 2.0 * p.x1 * (p.x2 + 3) - 5.0 * p.x2,
- Math.pow(p.x1, 2) - 5 * p.x1 + 4.0 * Math.pow(p.x2, 3) + 2.0 * p.x2 + 8
- );
- const GESSE = [
- [(p) => 24.0 * Math.pow(p.x1, 2) + 2.0 * p.x2 + 3.0, (p) => 2.0 * p.x1 - 5.0],
- [(p) => 2.0 * p.x1 - 5.0, (p) => 12.0 * Math.pow(p.x2, 2) + 2.0]
- ];
- let S = new Vec2(2.0, 1.0);
- let h = 0.1;
- let current = f(S);
- let last,
- g,
- i = 0;
- while (true) {
- last = f(S);
- const lS = S;
- g = grad(S);
- if (Math.sqrt(g.x1 * g.x1 + g.x2 * g.x2) <= E) {
- break;
- }
- const D1 = GESSE[0][0](S);
- const D2 = GESSE[0][0](S) * GESSE[1][1](S) - GESSE[0][1](S) * GESSE[1][0](S);
- const H = calcMatrix(GESSE, S);
- const INVH = calcInversed(H);
- const p = new Vec2(
- INVH[0][0] * g.x1 + INVH[0][1] * g.x2,
- INVH[1][0] * g.x1 + INVH[1][0] * g.x2
- );
- S = new Vec2(S.x1 - p.x1, S.x2 - p.x2);
- console.log(`Итерация ${i}<br>`);
- console.log(
- `<i>x<sup>(${i})</sup> =`,
- `(${lS.x1.toFixed(3)}, ${lS.x2.toFixed(3)})<sup>T</sup></i>`,
- ' '
- );
- console.log(
- `<i>f(x<sup>(${i})</sup>) = ${last.toFixed(3)}</i>`,
- ' '
- );
- console.log(
- `<i>∇f(x<sup>(${i})</sup>) =`,
- `(${lS.x1.toFixed(3)}, ${lS.x2.toFixed(3)})<sup>T</sup></i><br>`
- );
- console.log(
- `Матрица Гессе в точке <i>x<sup>(${i})</sup>: H(x<sup>(${i})</sup>) =`,
- `<table style="border-left: 1px solid black; border-right: 1px solid black"><tr>`,
- `<td>${H[0][0].toFixed(3)}</td>`,
- `<td>${H[0][1].toFixed(3)}</td></tr><tr>`,
- `<td>${H[1][0].toFixed(3)}</td>`,
- `<td>${H[1][1].toFixed(3)}</td></tr></table></i>`
- );
- console.log(
- `<i>p<sup>(${i})</sup> =`,
- `(${-p.x1.toFixed(3)}, ${-p.x2.toFixed(3)})<i>`,
- ' '
- );
- console.log(
- `<i>x<sup>(${i})</sup> =`,
- `(${S.x1.toFixed(3)}, ${S.x2.toFixed(3)})`,
- `<br><br>`
- );
- i++;
- }
- console.log(
- `Результат: <i>f(x<sup>(k)</sup>)<sub>min</sub> =`,
- `${f(S).toFixed(3)}</i>, при <i>x<sup>(k)</sup> =`,
- `(${S.x1.toFixed(3)}, ${S.x2.toFixed(3)})</i>`
- );
Add Comment
Please, Sign In to add comment