मैं फ़ंक्शन I को एकीकृत करने का प्रयास कर रहा हूं, जिसमें लीजेंड्रे बहुपद leg_f शामिल है:

import math
import numpy as np
from mpmath import *
from sympy import *
from scipy.special import legendre

n = 3

c = lambda h_c,z,R : (z**2+h_c**2)**0.5
c_supp = lambda h_c,z,R : (z**2+h_c**2)**(-n)    
x = lambda h_x,z,R : -4*R*(R-h_x)/c(h_x,z,R)**2

leg_f = lambda h_l,z,R : legendre(n-1,(1-0.5*x(h_l,z,R))/(1-x(h_l,z,R))**0.5)

f_f_symb = lambda h_v,z,R : hyper((n, 0.5), (1), (-4*R*(R-h_v)/(z**2+h_v**2)))

I = lambda h_i,z_i,R_i : c_supp(h_i,z_i,R_i)*(1-x(h_i,z_i,R_i))**(-n/2)*leg_f(h_i,z_i,R_i)

h_i,z_i,R_i = symbols('h_i z_i R_i')

int_result = integrate(I(h_i,z_i,R_i), (z_i, 0, np.inf)) 

लेकिन मुझे त्रुटि मिलती है

Traceback (most recent call last):
  File "test.py", line 99, in <module>
    int_result = integrate(I(h_i,z_i,R_i), (z_i, 0, np.inf)) 
  File "/Users/Library/Python/2.7/lib/python/site-packages/sympy/integrals/integrals.py", line 1276, in integrate
    integral = Integral(*args, **kwargs)
  File "/Users/Library/Python/2.7/lib/python/site-packages/sympy/integrals/integrals.py", line 75, in __new__
    obj = AddWithLimits.__new__(cls, function, *symbols, **assumptions)
  File "/Users/Library/Python/2.7/lib/python/site-packages/sympy/concrete/expr_with_limits.py", line 389, in __new__
    obj.is_commutative = function.is_commutative  # limits already checked
AttributeError: 'poly1d' object has no attribute 'is_commutative'

क्या समस्या हो सकती है? क्या इस तरह के फ़ंक्शन को sympy में एकीकृत करने का यह सही तरीका है?

-1
ani87 16 पद 2017, 17:28

1 उत्तर

सबसे बढ़िया उत्तर

आपके कोड में कुछ समस्याएं हैं जिन्हें मैं देख सकता हूं:

  1. आपको SciPy से legendre फ़ंक्शन आयात करने की आवश्यकता नहीं है। SymPy का अपना legendre फंक्शन है जो आपके द्वारा from sympy import * लिखने पर इम्पोर्ट हो जाता है। इसके अलावा, यदि आप प्रतीकात्मक परिणामों में रुचि रखते हैं, तो आपको SciPy या NumPy का बिल्कुल भी उपयोग नहीं करना चाहिए।
  2. यदि आप सांकेतिक संगणना चाहते हैं तो आपको अपने कोड में दशमलव संख्याएँ जैसे 0.5 नहीं लिखनी चाहिए। इसके बजाय आपको Rational(1,2) का उपयोग करना चाहिए जो कि SymPy ऑब्जेक्ट है जो भिन्न 1/2 का प्रतिनिधित्व करता है।
  3. अनंत के लिए NumPy के inf का उपयोग करने के बजाय, आपको अनंत के लिए Sympy के oo का उपयोग करना चाहिए।

निम्नलिखित कोड उपरोक्त मुद्दों से छुटकारा दिलाता है और इसलिए मूल त्रुटि जो आपको मिल रही थी।

from sympy import *

n = 3
c = lambda h_c,z,R : (z**2+h_c**2)**Rational(1,2)
c_supp = lambda h_c,z,R : (z**2+h_c**2)**(-n)    
x = lambda h_x,z,R : -4*R*(R-h_x)/c(h_x,z,R)**2
leg_f = lambda h_l,z,R : legendre(n-1,(1-Rational(1,2)*x(h_l,z,R))/(1-x(h_l,z,R))**Rational(1,2))
I = lambda h_i,z_i,R_i : c_supp(h_i,z_i,R_i)*(1-x(h_i,z_i,R_i))**(-n*Rational(1,2))*leg_f(h_i,z_i,R_i)

h_i,z_i,R_i = symbols('h_i z_i R_i')

int_result = integrate(I(h_i,z_i,R_i), (z_i, 0, inf))

दुर्भाग्य से, हालांकि SymPy आपके पास मौजूद फ़ंक्शन को जल्दी से एकीकृत नहीं कर सकता है। आपका इंटीग्रैंड इस तरह दिखता है

Original

सरलीकरण के बाद यह आंखों पर थोड़ा आसान हो जाता है लेकिन लगता है कि SymPy इस अभिन्न का मूल्यांकन करने की कोशिश में फंस गया है।

Simplified

जब तक प्रतीकात्मक परिणाम बिल्कुल आवश्यक न हों, मैं इस समस्या के लिए संख्यात्मक एकीकरण की अनुशंसा करता हूं।

0
user6764549user6764549 17 पद 2017, 06:10