2016-11-09 2 views
-1
def nu(r): 
    '''Returns the stellar density function.''' 
    return 1/(r * (1 + (r/a))**3) 

    mass_int = lambda r: 4 * r**2 * nu(r) 
    print(mass_int(0)) 

이것은 1/r 용어가 분리되어 평가되기 때문에 아마도 제로로 나누기 오류를줍니다. 이 문제를 해결하는 유일한 방법은 정확한 대수 표현식을 형성하기 위해 sympy를 사용하고 있습니까? 터무니없는 것 같아.변수를 취소하는 함수에서 제로로 나누는 것을 피하십시오.

답변

4

아무 잘못도 없습니다. r = 0 감안할 때 : 당신이 nu(0)를 요청할 때

1/(r * (1 + (r/a))**3) 
= 1/(0 * (1 + (0/a))**3) 
= 1/(0 * (1 + 0 )**3) 
= 1/(0 *  1  **3) 
= 1/(0 *   1  ) 
= 1/0 

그래서 당신이 오류가 발생합니다. 그것은 앞을 내다 보지 않으며 특별한 대수를하지 않습니다. 단지 오류를 던집니다. 파이썬은 마술이 아니며,이를 위해 sympy가 필요하다는 것은 터무니없는 일이 아닙니다.

r == 0의 경우 mass_int에 특별한 경우를 추가하는 것이 좋습니다.

+0

참으로, 아마도 try/except ZeroDivisionError가 도움이 될 것입니다 ... –

0

이것은 파이썬 질문 또는 컴퓨터 프로그래밍 질문이 아닙니다. 그것은 간단한 수학입니다.

f(x) = 1/(x * (1 + x/a)**3) 
g(x) = 4x**2 

h(x) = 4x/(1 + x/a)**3 

f (g (r))와 h (r)간에 차이가 있습니까? 물론 있습니다. 플롯이 완전히 똑같아 보이더라도 f (g (0))는 정의되지 않고 플롯에서 점 불연속으로 표시되어야합니다.

이 기능을 지능적으로 사용하면 포인트 불연속 점이 있음을 알 수 있습니다. 선택하면 f (g (r))을 h (r)로 바꿀 수 있습니다. 당신이 요청하지 않는 유일한 차이점은, 프로그래밍 언어 자체에 당신을 위해 함수의 합성을 감소하지 않습니다 원하는 스스로 그렇게하지 않는 0

수학에서 정의 된 기능을 갖는 한, 그리고 될 것입니다 당신이 사용자이기 때문에, 당신은 프로그램에서 원하는 것을 알기로되어 있습니다. 포인트 불연속 점이있는 함수 작성을 작성하는 경우, 이유가있을 경우 그렇게했을 것으로 예상됩니다. 인텔리전스는 컴파일러가 아닌 프로그래머에 있어야합니다. 스스로 작성하고 기능을 줄이거 나, sympy를하는 것과 같은 일을하십시오. 어느 쪽이든,이 두 기능을 서로 관련시켜야한다는 것은 컴퓨터에 명시 적으로 지정해야합니다.