2017-08-24 15 views
0

我已經看到了很多類似主題的答案,用NumericQ解釋過,但仍然不能完全理解我的實現有什麼問題,並且我的示例可以以我想要的方式進行評估它。 我在ParametricNDSolve的形式微分方程的溶液(I相信方程的精確形式是無關緊要的):Mathematica:FindFit for NIntegrate of ParametricNDSolve

sol = ParametricNDSolve[{n'[t] == g/(1/(y - f*y) + b*t + g*t)^2 - a*n[t] - c*n[t]^2, n[0] == y*f}, {n}, {t, 0, 10}, {a, b, c, g, f, y}] 

此後我試圖構建FindFit或類似的程序,Nintegrating函數超過函數N [ A,b,C,G,F,Y,t]的我有一些乘法器以上得到(我所選擇登錄[Z]作爲乘數爲簡單起見)

Func[z_, a_, b_, c_, g_, f_] := 
NIntegrate[ 
    Log[z]*(n[a, b, c, g, f, y][t] /. sol), {t, 0, 10}, {y, 0, Log[z]}] 

所以,我有NIntegrate在我的函數N [ params,t]從ParametricNDSolve派生,乘法器引入新的變量(z),它也存在於積分的極限中(與我的形式相同n乘法器,例如爲簡單起見)

我能夠在任意點(z)用給定值參數(a,b,c,g,f)評估函數Func的值:Func(0,1 ,2,3,4,5)可以被評估。 但因爲某些原因我不能使用FindFit這樣的:

FindFit[data, Func[z, a, b, c, g, f], {a, b, c, g, f}, z] 

的錯誤是:NIntegrate :: nlim:Y =日誌[Z]是不融合的一個有效的限制。

我嘗試了很多不同的?NumericQ用法的組合,並且所有這些組合都似乎無處可用。任何幫助,將不勝感激! 提前致謝,並對問題解釋中的純英語表示歉意。

回答

0

這裏是一個方式來定義你的函數:

sol = n /. 
    ParametricNDSolve[{n'[t] == 
    g/(1/(y - f*y) + b*t + g*t)^2 - a*n[t] - c*n[t]^2, 
    n[0] == y*f}, {n}, {t, 0, 10}, {a, b, c, g, f, y}] 

Func[z_?NumericQ, a_?NumericQ, b_?NumericQ, c_?NumericQ, g_?NumericQ, 
    f_?NumericQ] := 
    NIntegrate[Log[z]*sol[a, b, c, g, f, y][t], 
     {t, 0, 10}, {y, 0, Log[z]}] 

測試:Func[2, .45, .5, .13, .12, .2] - > 0.106107

我不樂觀,你會得到FindFit了良好的效果與函數有這麼多的參數和這在計算上非常昂貴。

+0

謝謝!但是我可以評估函數Func,即使不引入?NumericQ變量和這些變量也不能幫助我獲得FindFit - NIntegrate錯誤仍然存​​在。你對這種方法的計算開銷也是正確的,但是我只需要爲我的實驗數據完成幾次,我不想自己寫一些擬合算法 - 我相信它會變得更慢/錯誤。 – user3575511

+0

務必清除舊的定義。這個錯誤是由於'NIntegrate'被符號'z'評估的。 – agentp

相關問題