나는 일반적으로 로그 로그 공간에서 훨씬 매끄럽고 더 나은 동작을 수행하는 함수를 사용하고 있습니다. 이러한 숫자 함수를 로그 로그 공간에 통합하는 방법이 있습니까?
즉, 누적 적분을 수행하기 위해 일종의 간단한 사다리꼴 규칙을 사용하기를 바라고 있습니다 (예 : python에서 scipy.integrate.cumtrapz
). 성
그러나 나는 값을 사용하기를 바라고있다. 과 , 대신에 과 (가능할 때).
나는 일반적으로 로그 로그 공간에서 훨씬 매끄럽고 더 나은 동작을 수행하는 함수를 사용하고 있습니다. 이러한 숫자 함수를 로그 로그 공간에 통합하는 방법이 있습니까?
즉, 누적 적분을 수행하기 위해 일종의 간단한 사다리꼴 규칙을 사용하기를 바라고 있습니다 (예 : python에서 scipy.integrate.cumtrapz
). 성
그러나 나는 값을 사용하기를 바라고있다. 과 , 대신에 과 (가능할 때).
답변:
변수를 변경할 수 있습니다. 환경, . 적분은
당신은 통합하기 때문에 약간 조심해야 . 정확히 무엇을해야하는지에 따라 처럼 보인다.
나는 파이썬을 사용하지 않지만 올바르게 이해하면
그러나 당신은 샘플이 없습니다 과 오히려 오히려 샘플이 있습니다. 과 .
물론 가장 간단한 방법은
이제 사다리꼴 규칙 은 입력을 가정합니다.부분적으로 선형입니다. 간단한 일반화는 부분적으로 선형입니다.
이 경우 당신은
그런 다음 정의 당신은
그래서 적분은
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이 제공 한 훨씬 더 간결한 답변과 동일합니다. 유일한 차이점은 "특히 "는 부분 선형입니다 불연속으로 이산 와 메쉬 .)
로그-로그 플롯에서 함수가 부드럽게 보이면 각 구간마다 전력 법칙을 사용하여 보간 할 수 있습니다 (물리 법칙은 물론 로그-로그에 선형 임). 따라서 점 사이 과 가정하에 간격 내에서 , 당신은 얻을 과 . 구간에서 적분에 대한 기여 그렇다면
이전 답변 중 일부에서 변수 변경과 약간의 오류가 혼동된다고 생각합니다. 로그 함수의 적분은 적분의 로그가 아닙니다. 나는 일반적으로 로그의 적분을 아는 함수의 적분을 작성하는 것이 어렵다고 생각합니다. 누구든지 그 방법을 알고 있다면 관심이 있습니다.
한편, 위의 @Stefan의 솔루션은 로그 로그 공간에 함수를 통합하는 방법입니다. 시작점은 다루는 함수가 충분히 작은 세그먼트를 위해 로그 로그 공간에서 선형이라는 것입니다.
그런 다음 세그먼트 끝점에서 선의 방정식을 쓸 수 있습니다.
어디 선의 기울기 y 절편입니다.
둘을 빼면 다음을 찾을 수 있습니다.
그리고 대체에서 :
로그-로그 공간에서 세그먼트의 방정식이 선에 가까운 경우 정상 (선형) 공간에서 세그먼트의 방정식은 지수에 가깝습니다.
이 세그먼트에 대한 분석 공식이 있으면 쉽게 통합 할 수 있습니다.
과
이것은 부정 행위처럼 느껴지지만 이것은 로그 로그 공간에서 샘플링되어 선형 로그 공간의 함수를 로그 로그 공간에서 파생 된 매개 변수로 지수로 근사 할 수 있습니다.
log([x_2/x_1]^{m_1+1} + 1)
, 즉 로그의 인수에 추가 한이
내가 사용하는 솔루션은 기본적으로 사다리꼴 규칙의 구현이며 scipy.misc.logsumexp
정밀도를 유지하기 위해 함수를 사용합니다 . lny
대수를 반환하는 함수 가 있다면 y
다음 과 같이 할 수 있습니다.
scipy.misc 가져 오기 logsumexp에서 numpy를 np로 가져 오기 xmin = 1e-15 xmax = 1e-5 # x의 값을 로그 간격으로 구합니다. xvs = np.logspace (np.log10 (xmin), np.log10 (xmax), 10000) # xvs에서 함수 평가 lys = lny (xvs) # 사다리꼴 규칙 통합 수행 델타 = np.log (np.diff (xvs)) logI = -np.log (2.) + logsumexp ([logsumexp (lys [:-1] + deltas), logsumexp (lys [1 :] + deltas)])
값 logI
은 원하는 적분의 로그입니다.
설정해야 할 경우 분명히 작동하지 않습니다 xmin = 0
. 그러나 적분에 대해 0이 아닌 양의 하한이 있으면 xvs
적분이 수렴하는 수를 찾기 위해 포인트 수를 가지고 놀 수 있습니다 .