Tích hợp trong không gian log-log


10

Tôi đang làm việc với các chức năng, nói chung, mượt mà hơn và hoạt động tốt hơn trong không gian log-log --- vì vậy đó là nơi tôi thực hiện phép nội suy / ngoại suy, v.v., và nó hoạt động rất tốt. Có cách nào để tích hợp các hàm số này trong không gian log-log không?

tức là tôi hy vọng sử dụng một số loại quy tắc hình thang đơn giản để thực hiện tích phân tích lũy (ví dụ: trong python, use scipy.integrate.cumtrapz), để tìm một số F(r) st

F(r)= =0ry(x)dx

Nhưng tôi hy vọng sẽ sử dụng các giá trị tôiog(y)tôiog(x) , thay vì yx (khi có thể).


Tôi tìm thấy liên kết này ( my.originlab.com/forum/topic.asp?TOPIC_ID=1251 ) dường như đi theo cùng một cách tôi thường đi: tính độ dốc và chặn trong không gian log-log. Sau đó chuyển đổi sang không gian lin-lin, tích hợp và đánh giá.
MrMas

Câu trả lời:


6

Bạn chỉ có thể thay đổi các biến. Đặt , b ( a ) = l o g ( y ( x ) ) . Tích phân trở thànhmột= =tôiog(x)b(một)= =tôiog(y(x))

F(r)= =-tôiog(r)exp(một+b)dmột

Bạn cần phải có một chút cẩn thận bởi vì bạn đang tích hợp từ . Những gì bạn phải làm chính xác sẽ phụ thuộc vào y ( x ) trông như thế nào.-y(x)


Cám ơn phản hồi của bạn! Nhưng tôi nghĩ rằng điều này thực sự chỉ là thực hiện tích phân trong không gian tuyến tính. Có lẽ tôi đang yêu cầu điều gì đó không thể tuy nhiên ...
DilithiumMatrix

2
Không, điều này không thể thiếu trong không gian đăng nhập. Khi rời rạc, có kích thước bằng nhau trong không gian log, không phải không gian tuyến tính. dmột
Thép Damascus

1
@DilithiumMatrix là đúng: Sự rời rạc của các giá trị nằm trong không gian log, nhưng phép nội suy của các giá trị y xảy ra trong không gian tuyến tính. Do đó, nếu bạn sử dụng quy tắc hình thang, hàm được tích hợp hiệu quả là piecewise tuyến tính trong một âm mưu với trục x logarit và trục y tuyến tính. xy
burnpanck

3

Tôi không sử dụng python, nhưng nếu tôi hiểu đúng rồi bởi bạn đang nghĩ đến một cái gì đó giống như F = i n t e g r một t e ( y , x ) nơi F = [ F 1 , . . . , F n ] là một vectơ lấy mẫu tích phân trên lưới x .

F(r)= =0ry(x)dx
F= =Tôintegrmộtte(y,x)
F= =[F1,...,Fn]x

Tuy nhiên bạn không phải mẫu của y , mà là bạn có mẫu x = log ( x )y = log ( y ) .xyx^= =đăng nhập(x)y^= =đăng nhập(y)

Tất nhiên phương pháp đơn giản nhất sẽ là nhưng điều này sẽ dễ bị lỗi, bởi vì y ( x ) không được mịn, thậm chí mặc dù y ( x ) là.

F= =Tôintegrmộtte(điểm kinh nghiệm(y^),điểm kinh nghiệm(x^)),
y(x)y^(x^)

Bây giờ, quy tắc hình thang về cơ bản giả định đầu vào của bạn là tuyến tính. Vì vậy, các khái quát đơn giản sẽ cho bạn cho rằng y ( x ) là piecewise tuyến tính.y(x)y^(x^)

Trong trường hợp này, việc xác định , bạn có Δ F k = x k + 1 x k y ( x ) d x = x k + 1 x k e y ( x ) e x d x = x k +ΔFk= =Fk+1-Fk

ΔFk= =xkxk+1y(x)dx= =x^kx^k+1ey^(x^)ex^dx^= =x^kx^k+1y~(x^)dx^

Sau đó, xác định , bạn có y k + ty k + t Δ y k~ y ( t ) một e b t , với một = e y k + x kb = Δt= =(x^-x^k)/Δx^k

y^k+ty^k+tΔy^k
y~(t)mộtebtmột= =ey^k+x^k.b= =Δy^k+Δx^k

Vì vậy, không thể tách rời trở nên

ΔFkmộtΔx^01ebtdt= =mộtΔx^eb-1b

Trong Matlab, nó sẽ trông giống như

dlogx=diff(logx); dlogy=diff(logy); k=1:length(logx)-1;  
b=dlogx+dlogy; a=exp(logx+logy);  
dF=a(k).*dlogx.*(exp(b)-1)./b;  
F=cumsum([0,dF]);

Hi vọng điêu nay co ich!

y(x)y^(x^)x^F(x^1)= =0


Cảm ơn phản hồi (rất rõ ràng) của bạn, nhưng như tôi vừa nói khi trả lời @Dam DamascusSteel --- Tôi nghĩ rằng điều này chỉ trở lại tích hợp với không gian tuyến tính tuyến tính và mất đi lợi ích của không gian log.
DilithiumMatrix

1
điểm kinh nghiệm(b)-1b

3

(xTôi,yTôi)(xTôi+1,yTôi+1)y= =CTôixnTôiTôinTôi= =ln(yTôi/yTôi+1)/ln(xTôi/xTôi+1)CTôi= =ln(yTôi)-nTôiln(xTôi)Tôi

ΔFTôi= =xTôixTôi+1CTôixnTôidx= ={CTôinTôi+1(xTôi+1nTôi+1-xTôinTôi+1),nTôi-1CTôi(lnxTôi+1-lnxTôi),nTôi= =-1,
nTôi= =-1

3

Tôi nghĩ rằng có một chút nhầm lẫn với sự thay đổi của các biến trong một số câu trả lời trước đó cũng như một số lỗi. Tích phân của hàm log không phải là log của tích phân. Tôi nghĩ nói chung rất khó để viết ra tích phân của một hàm biết tích phân của nhật ký của nó. Nếu ai biết làm thế nào tôi sẽ quan tâm.

Trong khi đó, giải pháp của @ Stefan ở trên là cách để tích hợp một chức năng trong không gian log-log. Điểm khởi đầu là chức năng bạn đang xử lý là tuyến tính trong không gian log-log cho các phân đoạn đủ nhỏ.

nhập mô tả hình ảnh ở đây

đăng nhập(y1)= =m1đăng nhập(x1)+n1
đăng nhập(y2)= =m1đăng nhập(x1)+n1

m1n1

Bằng cách trừ hai, người ta có thể tìm thấy:

m1= =đăng nhập(y1)-tôiog(y2)đăng nhập(x1)-tôiog(x2)

n1= =đăng nhập(y1)-m1đăng nhập(x1)

Nếu trong không gian log-log, phương trình của một đoạn gần với một dòng thì trong không gian (tuyến tính) bình thường, phương trình của đoạn đó gần với số mũ:

y(x)xmen

Nếu chúng ta có một công thức phân tích cho phân khúc này, nó rất dễ tích hợp:

x1x2y(x)dx= =en1m1+1(x2m1+1-x1m1+1),cho m-1

x1x2y(x)dx= =en1đăng nhậpx2x1,cho m= =-1

Điều này cảm thấy giống như gian lận, nhưng đây là lấy mẫu trong không gian log-log để chúng ta có thể xấp xỉ hàm trong không gian tuyến tính theo cấp số nhân với các tham số xuất phát từ không gian log-log.


Điều này thật tuyệt vời @elenapascal, điều này đã làm phiền tôi trong hơn 3 năm nay và tôi nghĩ rằng đây là (hoặc rất gần với) giải pháp. Tôi hoàn toàn không tuân theo mối quan hệ cuối cùng của bạn, tôi không nghĩ rằng tích phân trên y bằng với nhật ký (x2 / x1)
DilithiumMatrix

Đặc biệt, nếu tôi lấy log của không thể thiếu trên trái tay-side, sau đó tôi nhận được một thuật ngữ tương tự như phía bên tay phải, nhưng với log([x_2/x_1]^{m_1+1} + 1), tức là có thêm 1 trong các đối số của các bản ghi
DilithiumMatrix

Hôm nay nó cũng làm phiền tôi rất nhiều, chỉ sau khi tôi viết nó tôi mới nhận ra @Stefan đã đăng câu trả lời tương tự. Với m = -1, bạn chỉ cần thay thế trong định nghĩa của y: y (x) = e ^ n / x. Điều đó cho nhật ký. Tôi không chắc chắn tôi theo dõi bài viết thứ hai của bạn
Elena Pascal

Tôi mới nhận ra điều tương tự, nhưng tôi đã không hiểu hết cho đến khi tôi đọc lời giải thích của bạn
DilithiumMatrix

1

Giải pháp tôi sử dụng về cơ bản là thực hiện quy tắc hình thang và sử dụng scipy.misc.logsumexpchức năng để duy trì độ chính xác. Nếu bạn có một số hàm lnytrả về logarit ythì bạn có thể làm, vd:

từ scipy.misc nhập logumbao
nhập numpy như np

xmin = 1e-15
xmax = 1e-5

# nhận các giá trị của x cách nhau logarit
xvs = np.logspace (np.log10 (xmin), np.log10 (xmax), 10000)

# đánh giá chức năng của bạn tại xvs
lys = lny (xvs)

# thực hiện tích hợp quy tắc hình thang
deltas = np.log (np.diff (xvs))
logI = -np.log (2.) + logumapi ([logumbao (lys [: - 1] + deltas), logumbao (lys [1:] + deltas)])

Giá trị logIlà nhật ký của tích phân mà bạn muốn.

Rõ ràng điều này sẽ không hoạt động nếu bạn cần thiết lập xmin = 0. Nhưng, nếu bạn có một số giới hạn thấp hơn không dương đối với tích phân, bạn chỉ có thể chơi với số điểm trong xvsđể tìm một số mà tích phân hội tụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.