作者obelisk0114 (追風箏的孩子)
看板Mathematica
標題Re: [問題] 數值積分
時間Mon May 4 14:32:09 2015
※ 引述《obelisk0114 (追風箏的孩子)》之銘言:
: 我想要用數值積分求下面這積分的 FWHM(半高全寬)
: http://i.imgur.com/LgocICB.png
: 我想求出最大值發生處以及其數值,然後用 FindRoot 解
: 但是第一步用 MaxValue 就跑出什麼 max precision 的問題
: 想問有什麼簡單的數值方法大致求出 FWHM
: 附上積分程式碼
: Integrate[(
: Abs[Integrate[
: E^(I*2*Pi/0.7*z*0.5^2*p^2)*BesselJ[0, 2*Pi/0.7*r*0.5*p]*p, {p,
: 0, 1}]])^2*r, {r, 0, 3552/15}]
後來用 Simpson's 3/8 rule (for n intervals)
http://en.wikipedia.org/wiki/Simpson%27s_rule
在 NIntegrate 出現精確度的問題
他說甚麼 bisection 在 9 次遞迴無法精確收斂之類的
f[z_?NumericQ, r_?NumericQ] :=
Abs@NIntegrate[
E^(I*2*Pi/0.7*z*0.5^2*p^2)*BesselJ[0, 2*Pi/0.7*r*0.5*p]*p, {p, 0,
1}]
g[z_, n_Integer] :=
ParallelTable[f[z, x]^2*x, {x, 0, 3552/15, 3552/15/n}].Join[{1},
Flatten[Table[{3, 3, 2}, {(n - 1)/3}]], {1}]*(3552/15/n)*3/8;
data = {#, g[#, 1000]} & /@ Range[-0.05, 3, 0.05]
ListLinePlot@data
Show[Plot[InterpolatingPolynomial[data, z], {z, 0, 1}],
ListLinePlot@data]
FindRoot[D[InterpolatingPolynomial[data, z], z], {z, 1}]
不知 NIntegrate 那邊要如何修改?
在 n 的數值,也就是切割次數那邊
假如切1000份,還會有 FindRoot 不夠逼近問題, 切割更細(試過4000)可以解決
不過 NIntegrate 問題仍然存在
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.232.118
※ 文章網址: https://www.ptt.cc/bbs/Mathematica/M.1430721134.A.73A.html
→ obelisk0114: 後來設定 MaxRecursion->20, AccuracyGoal->8 05/05 16:25
→ obelisk0114: PrecisionGoal->8, 沒有出現錯誤訊息 05/05 16:26