# Debugging the Swarzchild Metric - ValueError

• Python
• BiGyElLoWhAt
In summary, the metric function doesn't work and the code is giving errors when trying to fill the stars.f

#### BiGyElLoWhAt

Gold Member
I'm messing around with the swarzchild metric, and I keep getting errors. First, it was a memory, which I could have guessed, 10000x10000 array, so I lowered it to 1000x1000 and it moves past that point, now.
However, this is where I'm getting my error:
Python:
Gravity = zeros([1000,1000])
while i < 1000:
while j < 1000:
Gravity[i,j] = metric(sqrt((RS1*sin(ThetaS1)-i)**2+(RS1*cos(ThetaS1-j)**2)),Rs1,step,ThetaS1,omega1*step,speed1)
Gravity[i,j] += metric(sqrt((RS2*sin(ThetaS2)-i)**2+(RS2*cos(ThetaS2-j)**2)),Rs2,step,ThetaS2,omega2*step,speed2)

print("Done filling\n")
On the first line of the fill, the one with all the 1's, it's giving me this error:
"ValueError: setting an array element with a sequence."
From googling around, it seems that
"the shape of the input list isn't a (generalised) "box" that can be turned into a multidimensional array." -stack exchange.
I was wondering what I am missing that's making this error out?

I'm messing around with the swarzchild metric, and I keep getting errors. First, it was a memory, which I could have guessed, 10000x10000 array, so I lowered it to 1000x1000 and it moves past that point, now.
However, this is where I'm getting my error:
Python:
Gravity = zeros([1000,1000])
while i < 1000:
while j < 1000:
Gravity[i,j] = metric(sqrt((RS1*sin(ThetaS1)-i)**2+(RS1*cos(ThetaS1-j)**2)),Rs1,step,ThetaS1,omega1*step,speed1)
Gravity[i,j] += metric(sqrt((RS2*sin(ThetaS2)-i)**2+(RS2*cos(ThetaS2-j)**2)),Rs2,step,ThetaS2,omega2*step,speed2)

print("Done filling\n")
On the first line of the fill, the one with all the 1's, it's giving me this error:
"ValueError: setting an array element with a sequence."
From googling around, it seems that
"the shape of the input list isn't a (generalised) "box" that can be turned into a multidimensional array." -stack exchange.
I was wondering what I am missing that's making this error out?
I'm no Python expert, but taking it to be similar to C++: where are I and j incremented?

BiGyElLoWhAt
This is not a Python error. It is a NumPy error. Python has no problem with a composite (list, array, map, ...) in which one element is a number, another is a string, yet another is a list, and yet another is a map. This can be a "Good Thing", particularly with maps. Because it can be (and oftentimes is) a good thing to do, python allows it.

NumPy does have problems with this. By default, NumPy tries to be dimensionally correct from a mathematical perspective. Your code starts with Gravity = zeros([1000,1000]). Each element of that 1000 by 1000 array is a number. Assigning a non-numerical value such as a string, a list, a vector, a map, a set, or some other random object doesn't make sense. Python: No complaint. NumPy: Big complaint. This, too, is a "Good Thing".

You haven't shown us what your metric function is doing. Presumably it is not returning something that is trivially reducible to a number. It is instead returning a sequence.

BiGyElLoWhAt
Python:
def metric(r,rs, dt, theta,dtheta, v):
tau2 = (1-rs/r)*dt**2 - ((1 - rs/r)**-1)*(v*dt)**2 - (r**2)*(dtheta**2)
return tau2,
Here's the metric function.
I feel a little dumb for leaving out the increments, but adding them in didn't fix the problem.

well, here's the whole code, because why not...
Code:
# -*- coding: utf-8 -*-
"""
Created on Fri May 06 14:42:16 2016

@author: Tyler
"""

from __future__ import division
from math import sin, cos, sqrt, pi
from numpy import zeros

step = 1
G = 6.674*10**(-11)
c = 3*10**8
Mass1 = 10**20
Mass2 = 10**30
RS1 = 10**3
RS2 = -10**3
ThetaS1= 0
ThetaS2 = pi
Rs1 = 2*G*Mass1/(c**2)
Rs2 = 2*G*Mass2/(c**2)
distance = 100
CoM1 = distance/(1+Mass1/Mass2) #Distance to center of mass of system
CoM2 = distance/(1+Mass2/Mass1) #Distance to center of mass of system
speed1 = sqrt(G*Mass2/CoM1)
speed2 = sqrt(G*Mass1/CoM2)
omega1 = speed1/CoM1
omega2 = speed2/CoM2

def Move_Stars(r, theta):
x= r*cos(theta + step)
y = r*sin(theta + step)
return x,y
def metric(r,rs, dt, theta,dtheta, v):
tau2 = (1-rs/r)*dt**2 - ((1 - rs/r)**-1)*(v*dt)**2 - (r**2)*(dtheta**2)
return tau2,

#1 element represents 10000x10000 m
#zero = 5000,5000
i,j = 0,0

Array = [1000,1000]
Gravity = zeros(Array)
while i < 1000:
while j < 1000:
Gravity[i,j] = metric(sqrt((RS1*sin(ThetaS1)-i)**2+(RS1*cos(ThetaS1-j)**2)),Rs1,step,ThetaS1,omega1*step,speed1)
Gravity[i,j] += metric(sqrt((RS2*sin(ThetaS2)-i)**2+(RS2*cos(ThetaS2-j)**2)),Rs2,step,ThetaS2,omega2*step,speed2)
j+=1
i+=1
print("Done filling\n")
I've also adjusted it a couple times, trying to define Gravity in different ways, but none of them have solved the problem.

What is the significance of the comma after "return tau"?

BiGyElLoWhAt
Well, that's cool. I though I looked through it all pretty carefully. I fixed the comma, got a math domain error, and it turns out I also had a misplaced parentheses. Thanks everyone for pointing out my stupid mistakes. I'll try to look more carefully next time.

It works fine now, is what I mean.