Exact problems in an overridden linear system

Background

For this list of points, I want to check whether they lie inside a (possibly simpler) simplex. I want to do this in Python.

Problem

Edit: In the very heart, I want to (repeatedly) answer the question of whether uthe image is A(as a problem, a solution, so just yes / no).

First I do QR factorization, and then I solve the system and finally I check if the solution is correct.

import scipy.linalg
import numpy as np

Q,R = np.linalg.qr(AA)
for u in points:
  x = scipy.linalg.solve_triangular(R, np.dot(Q.T, u))
  print(all(x <= 1-1e-6) and all(x >= 1e-6) and all(abs(np.dot(AA,x) - u) < 1e-6))

However, I ran into numerical problems that accuracy seems too bad. I have a point lying inside (according to previous calculations with a linear program), but the code above does not recognize this.

100, (36,35), , , 1e-6

?

  • sympy, . .
  • 1e-6.
  • (.. ), , .

AA = np.array([
[1,  1,  1, 1,  1, 1,  1,  1,  1,  1, 1,  1, 1, 1, 1,  1, 1,  1, 1, 1,  1, 1, 1,  1,  1,  1,  1,  1,  1, 1,  1,  1,  1,  1,  1],
[0,  0,  0, 0,  0, 0,  0,  0,  0,  0, 0,  0, 0, 0, 0,  0, 0,  0, 0, 0,  2, 2, 2,  2,  2,  4,  4,  6,  6, 6,  6,  6,  6,  6,  8],
[0,  0,  0, 0,  0, 0,  0,  0,  0,  0, 0,  0, 0, 0, 2,  2, 2,  2, 4, 6,  0, 0, 0,  4,  4,  0,  0,  0,  0, 0,  0,  0,  0,  2,  6],
[0,  0,  0, 0,  0, 0,  0,  0,  0,  0, 0,  0, 2, 4, 0,  0, 0,  4, 4, 4,  0, 0, 4,  0,  2,  0,  0,  0,  0, 0,  2,  2,  6,  0,  0],
[0,  0,  0, 0,  0, 2,  2,  2,  4,  4, 6,  6, 0, 0, 0,  0, 2,  0, 0, 0,  0, 2, 0,  0,  0,  0,  2,  0,  0, 6,  0,  2,  4,  0,  4],
[0,  0,  0, 4, 10, 0,  0,  6,  0,  0, 2,  2, 2, 0, 2,  2, 4,  2, 2, 0,  0, 2, 4,  2,  0,  0,  0,  0,  4, 6,  2,  0,  2,  0,  0],
[0,  2,  2, 0,  4, 4,  4,  2,  2,  4, 2,  4, 2, 2, 2,  2, 2,  0, 0, 0,  0, 6, 2,  2,  0,  4,  0,  4,  0, 0,  0,  2,  0,  2,  0],
[0,  0,  2, 0,  4, 0,  2,  6,  0,  0, 0,  0, 6, 2, 0,  0, 0,  4, 6, 6,  6, 0, 4,  4,  0,  2,  6,  8,  0, 0,  0,  4,  0,  0,  0],
[0,  0,  0, 0,  6, 8,  0,  0,  2,  0, 2,  4, 2, 6, 2,  4, 2,  0, 0, 2,  2, 0, 0,  2,  4,  0,  0,  2,  4, 2, 10,  2,  0, 12,  0],
[0,  0,  0, 0,  0, 2,  0,  6,  2,  2, 0,  0, 2, 4, 0,  0, 0,  2, 0, 2,  2, 4, 0,  0,  6,  0,  0,  0,  0, 0,  0,  0,  2,  0,  0],
[0,  2,  0, 0,  2, 0,  0,  0,  0,  0, 4,  4, 0, 0, 0,  4, 2,  4, 8, 0,  0, 2, 2,  0,  0,  6,  0,  4,  0, 0,  2,  0,  0,  0,  0],
[0,  0,  2, 6,  4, 0,  0,  0,  0,  0, 8,  0, 6, 0, 4, 10, 0,  2, 0, 0,  4, 2, 6,  2,  2,  0,  2,  0,  0, 8,  2,  0,  0,  2,  0],
[0,  0,  2, 0,  4, 8,  2, 14,  0,  0, 6,  0, 0, 0, 4,  8, 0,  4, 2, 4,  0, 0, 0,  0,  0,  2,  8,  0,  0, 0,  0,  0,  0,  8,  2],
[0,  0,  6, 6,  0, 0,  0,  0,  4,  0, 0,  0, 0, 4, 4,  0, 0,  2, 0, 0,  2, 2, 2,  0,  0,  0,  2,  0,  0, 8,  0,  4,  0,  2,  0],
[0,  6,  0, 2,  0, 2,  0,  2,  0,  0, 0, 10, 0, 0, 0,  0, 4,  0, 0, 2,  0, 0, 0,  2,  0,  2,  0,  2,  2, 2,  2,  4,  0,  2,  0],
[0,  0,  0, 6,  0, 0,  8,  0,  0,  0, 8,  0, 8, 0, 0,  0, 2,  4, 0, 0,  2, 0, 0,  0,  2,  0,  4,  0,  0, 2,  0, 10,  8,  0,  2],
[0,  2,  2, 0,  0, 0,  2,  0,  2,  2, 0,  0, 0, 0, 0,  2, 0,  0, 2, 0,  2, 0, 2,  6,  2,  0,  0,  2,  6, 2,  4,  0,  4,  0,  2],
[0, 10,  0, 0,  0, 2,  2,  4,  0,  2, 0,  0, 0, 8, 0,  6, 6,  4, 0, 4,  2, 2, 0,  2,  0,  4,  0,  0,  0, 2,  0,  0,  4,  0, 10],
[0,  4,  0, 0,  4, 2,  0,  0,  0,  0, 2,  2, 0, 0, 0,  0, 0,  0, 4, 4,  0, 8, 2, 12,  4,  8,  0,  0,  4, 0,  6,  2, 10,  0,  2],
[0,  0,  4, 8,  6, 2,  0,  0, 12,  0, 2,  2, 0, 0, 0,  0, 2,  4, 0, 2,  0, 2, 0,  2,  4,  0,  2,  2, 10, 0,  0,  0,  0,  2,  2],
[0,  2,  2, 2,  2, 0,  0,  0,  2,  0, 0,  0, 6, 6, 2,  0, 2,  2, 4, 2,  4, 4, 4,  2, 10,  6,  2,  0,  2, 0,  0,  0,  2,  2,  8],
[0,  4,  0, 4,  0, 0,  0,  0,  2, 16, 0,  2, 0, 0, 6,  0, 4,  0, 0, 4,  0, 2, 0,  0,  0,  0,  0,  4,  0, 0,  0,  0,  0,  2,  0],
[0,  0,  0, 0,  0, 0,  2,  2,  0,  0, 2,  0, 6, 0, 0,  0, 2,  0, 0, 0,  2, 0, 4,  0,  2,  4,  2,  2,  2, 0,  0,  0,  0,  2,  0],
[0,  0,  4, 6,  6, 2,  8,  0,  4,  0, 0,  2, 0, 2, 0,  2, 4,  2, 0, 0,  2, 2, 0,  6,  2, 12,  4,  0,  0, 0,  4,  0,  0,  4,  2],
[0,  0,  4, 0,  0, 0,  0,  2,  4,  2, 2,  0, 0, 0, 2,  2, 4,  4, 4, 4,  2, 4, 4,  0,  2,  0,  0,  6,  2, 2,  2,  6,  0,  0,  2],
[0,  0,  2, 0,  0, 0,  0,  0,  0,  0, 0, 10, 2, 0, 8,  2, 4,  0, 0, 0,  0, 0, 0,  0,  4,  0,  0,  4,  2, 2,  0,  0,  2,  0,  2],
[0,  2,  0, 0,  0, 8,  4,  2,  4,  6, 0,  0, 0, 2, 0,  0, 2,  0, 8, 0,  0, 0, 0,  0,  2,  0,  2,  0, 12, 4,  0,  0,  2,  0,  4],
[0,  0,  0, 0,  0, 0,  8,  2,  8,  2, 2,  2, 2, 0, 0,  2, 2, 10, 0, 2,  0, 0, 2,  2,  0,  2,  4,  0,  0, 6,  4,  4,  2,  4,  0],
[0,  4,  2, 0,  0, 0,  0,  0,  0,  0, 0,  2, 2, 4, 6,  0, 0,  0, 0, 4,  0, 2, 6,  2,  0,  0,  0,  0,  2, 0,  4,  0,  4,  0,  0],
[0,  0,  2, 0,  0, 2,  0,  0,  0,  6, 0,  0, 0, 4, 2,  0, 0,  0, 0, 0,  8, 0, 4,  0,  0,  0,  2,  0,  0, 0,  2,  2,  0,  2,  2],
[0,  8,  4, 4,  0, 0, 12,  0,  6,  0, 6,  2, 0, 6, 4,  2, 2,  0, 4, 0,  0, 2, 2,  0,  4,  0,  0,  0,  2, 0,  8,  0,  0,  0,  0],
[0,  0,  8, 0,  0, 0,  0,  0,  0,  4, 0,  2, 6, 2, 0,  0, 0,  0, 0, 2,  0, 2, 0,  0,  2,  2,  0,  2,  0, 2,  0,  4,  0,  0,  0],
[0,  6, 10, 6,  6, 4,  0,  0,  0,  4, 0,  2, 0, 4, 4,  0, 0,  4, 0, 0, 10, 0, 0,  2,  0,  2,  0, 10,  0, 0,  0,  0,  0,  2,  0],
[0,  2,  0, 4,  0, 8,  2,  0,  2,  4, 0,  2, 2, 0, 0,  4, 2,  0, 2, 4,  2, 4, 4,  0,  0,  0,  2,  0,  0, 0,  0,  0,  0,  2,  0],
[0,  4,  0, 0,  0, 0,  2, 10,  0,  2, 4,  0, 2, 0, 6,  4, 2,  0, 4, 0,  6, 2, 0,  2,  0,  0, 10,  0,  0, 0,  0,  6,  0,  2,  0],
[0,  0,  2, 2,  0, 4,  0,  0,  0,  0, 2,  0, 0, 0, 0,  0, 2,  0, 2, 0,  0, 2, 0,  2,  0,  0,  2,  2,  0, 0,  0,  0,  2,  0,  2]])
v = np.array([1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 1, 2, 1, 2, 2, 2, 1])
points = [v]
+4

Source: https://habr.com/ru/post/1696312/


All Articles