Why is this matrix not working in my program?

  • Thread starter Thread starter etotheipi
  • Start date Start date
  • Tags Tags
    Matrix Program
AI Thread Summary
The discussion revolves around solving a problem from Project Euler using Python and NumPy for polynomial interpolation. A user is attempting to construct a matrix M for fitting a polynomial of degree (j-1) to j data points but encounters an IndexError due to incorrect indexing. The suggested correction involves changing the indexing to M[y-1, x-1]. Despite implementing this fix, the user still does not receive the expected output, leading to further debugging efforts. Participants emphasize the importance of understanding Python's range function and suggest refactoring loops to start at zero for clarity. There are recommendations to print variable values for debugging and to consider simpler interpolation methods. The conversation highlights the iterative nature of coding and debugging, particularly in mathematical programming tasks.
etotheipi
https://projecteuler.net/problem=101
Code:
import numpy as np
for j in range (1,11):
    M = np.empty([j, j])
    for x in range(1,j+1):
        for y in range(1,j+1):
            M[y,x] = y**(j-x)
    Minv = np.linalg.inv(M)
The ##j^{\mathrm{th}}## estimate ##\mathrm{OP}(j,n)## which fits ##j## data points is a ##(j-1)^{\mathrm{th}}## degree polynomial ##u^{(j)}(n) = a_{j-1} n^{j-1} + \dots + a_{0}## which agrees with ##u_n## on the set ##n \in \{1, \dots, j \}##, so$$\mathbf{a} := \begin{pmatrix} a_{j-1} \\ \vdots \\ a_0 \end{pmatrix} = \begin{pmatrix} 1 & 1 & \cdots & 1 \\ 2^{j-1} & 2^{j-2} & \cdots & 1 \\ \vdots & \vdots & & \vdots \\ j^{j-1} & j^{j-2} & \cdots & 1\end{pmatrix}^{-1} \begin{pmatrix} u_1 \\ \vdots \\ u_j \end{pmatrix} := \mathbf{M}^{-1} \mathbf{u}$$I need to make the matrix ##\mathbf{M}##, why does it not work?
Code:
M[y,x] = y**(j-x)
IndexError: index 1 is out of bounds for axis 0 with size 1
 
Last edited by a moderator:
Technology news on Phys.org
For the M[x,y] assignment do you mean M[x-1,y-1] ?
 
  • Like
Likes etotheipi
oh yeah that's it thanks :smile:
 
Last edited by a moderator:
It does not give me the correct answer :frown:
Python:
import numpy as np
sum = 0
def p(k):
    s = 0
    for i in range(0,11):
        s += ((-1)**i)*(k**i)
    return s
for j in range (1,11):
    M = np.empty(shape=(j,j))
    for x in range(1,j+1):
        for y in range(1,j+1):
            M[y-1,x-1] = y**(j-x)
    Minv = np.linalg.inv(M)
    U = np.empty(shape=(j,1))
    for i in range(1, j+1):
        U[i-1] = p(i)
    A = np.matmul(Minv, U)
    z = 1
    FIT_found = False
    while(FIT_found == False):
        estimate = 0
        for r in range(0,j):
            estimate += A[r]*z**r
        if(estimate != p(z)):
            sum += estimate
            FIT_found = True
        else:
            z = z + 1      
print(sum)
 
Last edited by a moderator:
etotheipi said:
It does not give me the correct answer :frown:
I think the idea of doing Project Euler problems is to work on your code until it does :smile:

When posting code here it helps if you add the language so syntax highlighting works:
Python:
import numpy as np
sum = 0
def p(k):
    s = 0
    for i in range(0,11):
        s += ((-1)**i)*(k**i)
    return s
for j in range (1,11):
    M = np.empty(shape=(j,j))
    for x in range(1,j+1):
        for y in range(1,j+1):
            M[y-1,x-1] = y**(j-x)
    Minv = np.linalg.inv(M)
    U = np.empty(shape=(j,1))
    for i in range(1, j+1):
        U[i-1] = p(i)
    A = np.matmul(Minv, U)
    z = 1
    FIT_found = False
    while(FIT_found == False):
        estimate = 0
        for r in range(0,j):
            estimate += A[r]*z**r
        if(estimate != p(z)):
            sum += estimate
            FIT_found = True
        else:
            z = z + 1
print(sum)
 
  • Like
Likes etotheipi
I always get confused by Python's range() function: note that range(1, 11) gives you [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]: this is the first thing I'd check.

And then i'd check that my j, x, and y values are doing what I want in the inner loop (either with an IDE or a simple print statement).

Edit: first of all I'd refactor it so all my loops start at 0, it makes it much easier to keep track.
 
  • Like
Likes etotheipi
thanks okay I'm going to finish this tomorrow because I have homework and my stupid code is giving me -670.99996864
 
  • Haha
Likes pbuk
etotheipi said:
thanks okay I'm going to finish this tomorrow because I have homework and my stupid code is giving me -670.99996864
:eek: yeah, I don't think that's right.
 
pbuk said:
I always get confused by Python's range() function: note that range(1, 11) gives you [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]: this is the first thing I'd check.

And then i'd check that my j, x, and y values are doing what I want in the inner loop (either with an IDE or a simple print statement).

Edit: first of all I'd refactor it so all my loops start at 0, it makes it much easier to keep track.

That’s how I checked the code. I called that seldom used secret programmers function:

Python:
print(‘j = %d, x = %d, y = %d’%(j,x,y))

just before his M assignment.
 
  • #10
I'd look for a simpler method of polynomial interpolation if I were you.
 
Back
Top