ส่วนประกอบสำคัญในพื้นที่บันทึกการทำงาน


10

ฉันกำลังทำงานกับฟังก์ชั่นซึ่งโดยทั่วไปแล้วจะราบรื่นกว่าและทำงานได้ดีกว่าในพื้นที่ล็อก - ล็อก - นั่นคือที่ที่ฉันทำการแก้ไข / คาดการณ์ ฯลฯ และทำงานได้ดีมาก มีวิธีรวมฟังก์ชันตัวเลขเหล่านี้ในพื้นที่บันทึกล็อกหรือไม่

เช่นฉันหวังว่าจะใช้กฎ trapezoidal แบบง่าย ๆ ในการหาอินทิกรัลสะสม (เช่นใน python, use scipy.integrate.cumtrapz) เพื่อหาF(r) เซนต์

F(r)=0ry(x)dx

แต่ฉันหวังว่าจะใช้ค่า log(y) และ log(x), แทน y และ x (เมื่อเป็นไปได้).


ฉันพบลิงค์นี้ ( my.originlab.com/forum/topic.asp?TOPIC_ID=1251 ) ซึ่งดูเหมือนว่าจะเป็นแบบเดียวกับที่ฉันจะไปโดยทั่วไป: คำนวณความชันและจุดตัดในพื้นที่ล็อกบันทึก จากนั้นแปลงเป็นพื้นที่ lin-lin รวมและประเมินผล
MrMas

คำตอบ:


6

คุณสามารถเปลี่ยนตัวแปรได้ การตั้งค่าa=log(x), b(a)=log(y(x)). อินทิกรัลกลายเป็น

F(r)=log(r)exp(a+b)da

คุณต้องระวังนิดหน่อยเพราะคุณรวมตัวกัน . สิ่งที่คุณต้องทำอย่างแน่นอนจะขึ้นอยู่กับอะไรy(x) ดูเหมือนกับ.


ขอบคุณสำหรับคำตอบของคุณ! แต่ฉันคิดว่านี่เป็นเพียงการแสดงอินทิกรัลในพื้นที่เชิงเส้นอย่างมีประสิทธิภาพ บางทีฉันขอสิ่งที่เป็นไปไม่ได้ แต่ ...
DilithiumMatrix

2
ไม่สิ่งนี้สำคัญในพื้นที่บันทึก เมื่อแยกแยะdaมีขนาดเท่ากันในพื้นที่บันทึกไม่ใช่พื้นที่เชิงเส้น
เหล็กดามัสกัส

1
@DilithiumMatrix นั้นถูกต้อง: การแยกส่วนของ x ค่าอยู่ในพื้นที่บันทึก แต่การแก้ไขของ yค่าที่เกิดขึ้นในพื้นที่เชิงเส้น ดังนั้นถ้าคุณต้องใช้กฎสี่เหลี่ยมคางหมูฟังก์ชันที่รวมกันอย่างมีประสิทธิภาพคือเชิงเส้นเป็นจำนวนเต็มในพล็อตที่มีแกน x แบบลอการิทึมและแกน y เชิงเส้น
burnpanck

3

ฉันไม่ได้ใช้หลาม แต่ถ้าฉันเข้าใจถูกต้องแล้ว

F(r)=0ry(x)dx
คุณกำลังคิดอะไรบางอย่างเช่น
F=integrate(y,x)
ที่ไหน F=[F1,...,Fn] คือการสุ่มตัวอย่างเวกเตอร์อินทิกรัลเหนือกริด x.

อย่างไรก็ตามคุณไม่มีตัวอย่างของ x และ yแต่คุณมีตัวอย่างของ x^=log(x) และ y^=log(y).

แน่นอนวิธีการที่ง่ายที่สุดจะเป็น

F=integrate(exp(y^),exp(x^)),
แต่นี่อาจเป็นข้อผิดพลาดได้ง่ายเพราะ y(x) ไม่ราบรื่นแม้ว่า y^(x^) คือ.

ทีนี้กฎรูปสี่เหลี่ยมคางหมูถือว่าอินพุตของคุณเป็นหลักy(x)เป็นเส้นตรงเชิงเส้น ดังนั้นการวางนัยทั่วไปจะให้คุณสมมติว่าy^(x^) เป็นเส้นตรงเชิงเส้น

ในกรณีนี้ให้นิยาม ΔFk=Fk+1Fk, คุณมี

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

จากนั้นกำหนด t=(x^x^k)/Δx^k, คุณมี

y^k+ty^k+tΔy^k
และ y~(t)aebtกับ a=ey^k+x^k และ b=Δy^k+Δx^k.

ดังนั้นอินทิกรัลจึงกลายเป็น

ΔFkaΔx^01ebtdt=aΔx^eb1b

ใน Matlab สิ่งนี้จะดูเหมือน

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]);

หวังว่านี่จะช่วยได้!

(แก้ไข: คำตอบของฉันเป็นคำตอบเดียวกับคำตอบที่กระชับกว่าที่ Damascus Steel ให้เมื่อฉันพิมพ์ความแตกต่างเพียงอย่างเดียวคือฉันพยายามให้คำตอบเฉพาะสำหรับกรณีที่ "เจาะจง" y(x)"เป็นเส้นตรงจำนวนเต็ม y^(x^) discretized กว่าไม่ต่อเนื่อง x^ ตาข่ายด้วย F(x^1)=0.)


ขอบคุณสำหรับการตอบสนอง (ชัดเจนมาก) ของคุณ แต่อย่างที่ฉันเพิ่งพูดไปในการตอบสนองต่อ @DamascusSteel --- ฉันคิดว่านี่เป็นเพียงการคืนค่าอินทิกรัลให้กับพื้นที่เชิงเส้นเชิงเส้นและสูญเสียผลประโยชน์จากพื้นที่บันทึก
DilithiumMatrix

1
@DilithiumMatrix: นี่ไม่ใช่คำตอบเดียวกับ DamascusSteel โปรดทราบว่าการใช้กฎสี่เหลี่ยมคางหมูกับคำตอบของ DamascusSteel จะไม่ให้exp(b)1bปัจจัย.
burnpanck

3

หากฟังก์ชั่นดูราบรื่นในพล็อตการบันทึกล็อกคุณสามารถแก้ไขโดยใช้กฏพลังงานในแต่ละช่วงเวลาได้ ดังนั้นระหว่างจุด(xi,yi) และ (xi+1,yi+1) ภายใต้สมมติฐานที่ว่า y=Cixni ภายในช่วงเวลา iคุณได้รับ ni=ln(yi/yi+1)/ln(xi/xi+1) และ Ci=ln(yi)niln(xi). การสนับสนุนให้อินทิกรัลจากช่วงเวลาi เป็นแล้ว

ΔFi=xixi+1Cixnidx={Cini+1(xi+1ni+1xini+1),ni1Ci(lnxi+1lnxi),ni=1,
เห็นได้ชัดว่าคุณต้องการความอดทนในการระบุกรณีพิเศษ ni=1 ในการดำเนินการของคุณ

3

ฉันคิดว่ามีความสับสนเล็กน้อยกับการเปลี่ยนแปลงของตัวแปรในคำตอบก่อนหน้านี้บางส่วนรวมถึงข้อผิดพลาดบางอย่าง อินทิกรัลของฟังก์ชันบันทึกไม่ใช่บันทึกของอินทิกรัล โดยทั่วไปฉันคิดว่าเป็นการยากที่จะเขียนอินทิกรัลของฟังก์ชันที่รู้ว่าอินทิกรัลของบันทึก หากใครรู้วิธีที่จะทำฉันจะสนใจ

ในขณะเดียวกันวิธีการแก้ปัญหาของ @ Stefan ด้านบนเป็นวิธีการรวมฟังก์ชั่นในพื้นที่บันทึกล็อก จุดเริ่มต้นคือฟังก์ชั่นที่คุณกำลังทำอยู่นั้นเป็นเส้นตรงในพื้นที่บันทึกการทำงานสำหรับเซกเมนต์เล็ก ๆ พอ

จากนั้นหนึ่งสามารถเขียนสมการของบรรทัดที่จุดปลายเซ็กเมนต์: ป้อนคำอธิบายรูปภาพที่นี่

log(y1)=m1log(x1)+n1
log(y2)=m1log(x1)+n1

ที่ไหน m1 คือความชันของเส้นและ n1 คือค่าตัดแกน y

ด้วยการลบทั้งสองเราสามารถหา:

m1=log(y1)log(y2)log(x1)log(x2)

และจากการทดแทน:

n1=log(y1)m1log(x1)

ถ้าใน log-log สมการของเซ็กเมนต์นั้นใกล้กับบรรทัดดังนั้นในพื้นที่ (linear) ปกติสมการของเซกเมนต์นั้นใกล้กับ exponential:

y(x)xmen

หากเรามีสูตรการวิเคราะห์สำหรับส่วนนี้มันง่ายที่จะรวม:

x1x2y(x)dx=en1m1+1(x2m1+1x1m1+1),for m1

และ

x1x2y(x)dx=en1logx2x1,for m=1

สิ่งนี้ให้ความรู้สึกเหมือนการโกง แต่นี่เป็นการสุ่มตัวอย่างในพื้นที่บันทึกล็อกซึ่งเราสามารถประมาณฟังก์ชันในพื้นที่เชิงเส้นเป็นเลขชี้กำลังด้วยค่าพารามิเตอร์ที่ได้มาจากพื้นที่ล็อกบันทึก


นี่คือ @elenapascal ที่ยอดเยี่ยมสิ่งนี้รบกวนฉันมานานกว่า 3 ปีแล้วและฉันคิดว่านี่เป็นวิธีแก้ปัญหา (หรือใกล้เคียง) ฉันไม่ได้ติดตามความสัมพันธ์ครั้งล่าสุดของคุณฉันไม่คิดว่าอินทิกรัลของ y เท่ากับบันทึก (x2 / x1)
DilithiumMatrix

โดยเฉพาะอย่างยิ่งถ้าฉันนำบันทึกของอินทิกรัลมาทางซ้ายมือฉันจะได้คำที่คล้ายกันทางด้านขวามือ แต่ด้วยlog([x_2/x_1]^{m_1+1} + 1)นั่นคือ +1 เพิ่มเติมในอาร์กิวเมนต์ของบันทึก
DilithiumMatrix

มันรบกวนฉันมากในวันนี้เช่นกันหลังจากฉันเขียนฉันก็รู้ว่า @tefan โพสต์คำตอบเดียวกัน สำหรับ m = -1 คุณเพียงแทนที่มันในนิยามของ y: y (x) = e ^ n / x ที่ให้บันทึก ฉันไม่แน่ใจว่าฉันติดตามโพสต์ที่สองของคุณ
Elena Pascal

ฉันเพิ่งรู้สิ่งเดียวกัน แต่ฉันยังไม่เข้าใจจนกระทั่งฉันอ่านคำอธิบายของคุณ
DilithiumMatrix

1

โซลูชันที่ฉันใช้นั้นเป็นการนำกฎของรูปสี่เหลี่ยมคางหมูมาใช้และใช้ประโยชน์จากscipy.misc.logsumexpฟังก์ชันเพื่อรักษาความแม่นยำ หากคุณมีฟังก์ชั่นบางอย่างlnyที่ส่งกลับค่าลอการิทึมจากyนั้นคุณสามารถทำได้เช่น:

จาก scipy.misc นำเข้า logsumexp
นำเข้าจำนวนมากเป็น np

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

# รับค่า x เว้นระยะลอการิทึม
xvs = np.logspace (np.log10 (xmin), np.log10 (xmax), 10,000)

# ประเมินฟังก์ชันของคุณที่ xvs
lys = lny (xvs)

# ดำเนินการรวมกฎสี่เหลี่ยมคางหมู
deltas = np.log (np.diff (xvs))
logI = -np.log (2.) + logsumexp ([logsumexp (lys [: - 1] + deltas), logumexp (lys [1:] + deltas)])

ค่าlogIคือบันทึกของอินทิกรัลที่คุณต้องการ

xmin = 0เห็นได้ชัดว่านี้จะไม่ทำงานถ้าคุณจำเป็นต้องตั้งค่า แต่ถ้าคุณมีขีด จำกัด ล่างที่ไม่เป็นศูนย์บวกกับอินทิกรัลคุณก็สามารถเล่นกับจำนวนคะแนนในxvsการหาจำนวนที่อินทิกรัลรวมกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.