Hướng dẫn dùng integral 1/x python

The absence of abs is not just to "keep it simple". As the SymPy lead developer wrote,

SymPy doesn't return log(abs(x)) for integrate(1/x) because it isn't valid for complex numbers. Instead, the answer is correct up to an integration constant (which may be complex). All SymPy operations assume that variables are complex by default.

The rest of the linked issue is also relevant to your question. From a certain point of view, log(cos(x) - 1): is as valid as log(1 - cos(x)) in the result of integration: the difference between these two expressions is I*pi, which is absorbed by the constant of integration. Besides, cos(x) could be greater than 1 for complex x, like cos(I) = 1.54...

That said, the following is a way to force the constant term in logs to be nonnegative.

def fix_logs(expr):
    replacements = {}
    for a in expr.atoms(log):
        if a.args[0].as_coeff_add()[0].is_negative:
            replacements[a] = log(-a.args[0]) + log(-1)
    return expr.xreplace(replacements)

Here is how it works:

rv = integrate(cos(x)**2/sin(x), x)
rv2 = fix_logs(rv)
rv3 = Add(*fix_logs(rv2).as_coeff_add(x)[1])

Here rv, rv2, and rv3 are:

log(cos(x) - 1)/2 - log(cos(x) + 1)/2 + cos(x)
log(-cos(x) + 1)/2 - log(cos(x) + 1)/2 + cos(x) + I*pi/2
log(-cos(x) + 1)/2 - log(cos(x) + 1)/2 + cos(x)

The function fix_logs does not remove the log(-1) part because it could be important: x*log(x-1) becomes x*(log(1-x) + I*pi/2) where the constant cannot be simply dropped. But if desired, the additive constant can be removed as shown in the calculation of rv3.

Reference for as_coeff_add method

Tôi có hai mảng dữ liệu được lập bảng, x và y và tôi không biết hàm đã tạo dữ liệu. Tôi muốn có thể đánh giá tích phân của đường được tạo ra bởi dữ liệu tại bất kỳ điểm nào dọc theo trục x.

Thay vì nội suy một hàm từng mảnh vào dữ liệu và sau đó cố gắng tích hợp hàm đó, điều mà tôi đang gặp khó khăn, có thứ gì tôi có thể sử dụng để cung cấp tích phân đơn giản bằng cách đánh giá các mảng không?

Khi tìm kiếm các giải pháp, tôi đã thấy các tham chiếu đến iPython và Pandas, nhưng tôi không thể tìm thấy các phần của những gói đó sẽ hỗ trợ cho nhiệm vụ này.

Nếu không có cách nào để tích hợp các mảng một cách đơn giản, bạn có thể đưa ra một số lời khuyên về cách tốt nhất để xử lý tác vụ này không?

  • python
  • arrays
  • integration
  • interpolation

22 hữu ích 0 bình luận 45k xem chia sẻ

answer

22

Hướng dẫn dùng integral 1/x python

Scipy có một số công cụ tuyệt vời để thực hiện tích hợp số.

Ví dụ: bạn có thể sử dụng scipy.integrate.simpsđể thực hiện Quy tắc của simpson và bạn có thể chuyển nó như sau:

scipy.integrate.simps (y, x = Không, dx = 1, axis = -1, Even = 'avg')

Các tham số:
y: array_like Mảng được tích hợp.

x: array_like, tùy chọn Nếu cho trước, các điểm tại đó y được lấy mẫu.

dx: int, Khoảng cách tùy chọn của các điểm tích hợp dọc theo trục của y. Chỉ được sử dụng khi x là Không có. Mặc định là 1.

axis: int, Axis tùy chọn để tích hợp. Mặc định là trục cuối cùng.

chẵn: {'avg', 'first', 'str'}, tùy chọn

'avg': Trung bình hai kết quả: 1) sử dụng N-2 khoảng đầu tiên với quy tắc hình thang trên khoảng cuối cùng và 2) sử dụng N-2 khoảng cuối cùng với quy tắc hình thang trên khoảng đầu tiên.

'đầu tiên': Sử dụng quy tắc Simpson cho N-2 khoảng đầu tiên với quy tắc hình thang trên khoảng cuối cùng.

'cuối cùng': Sử dụng quy tắc Simpson cho N-2 khoảng cuối cùng với quy tắc hình thang trên khoảng đầu tiên.

Vì vậy, bạn có thể sử dụng hai mảng của mình để thực hiện tích hợp số.

22 hữu ích 2 bình luận chia sẻ

answer

13

Hướng dẫn dùng integral 1/x python

Scipy có một tính năng tích hợp có thể giúp bạn.

Nếu bạn muốn sử dụng tổng tích lũy của các hình thang để tích phân, điều này có thể là tốt nhất cho một loạt các điểm.

Bạn có thể làm được việc này:

>>> from scipy import integrate
>>> x = np.linspace(-2, 2, num=20)
>>> y = x
>>> y_int = integrate.cumtrapz(y, x, initial=0)
>>> plt.plot(x, y_int, 'ro', x, y[0] + 0.5 * x**2, 'b-')
>>> plt.show()

Điều này cũng sẽ vẽ biểu đồ dữ liệu và hiển thị nó cho bạn bằng đồ thị. Đây là lệnh gọi tích hợp integrate.cumtrapz(y, x, initial=0)trong đó x và y là hai mảng của bạn.

13 hữu ích 1 bình luận chia sẻ

Hướng dẫn dùng integral 1/x python

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

Hướng dẫn dùng integral 1/x python