2017-08-24 2 views
0

J'ai vu plusieurs réponses pour des sujets assez similaires à l'utilisation de? NumericQ expliqué et ne comprends toujours pas ce qui ne va pas avec ma mise en œuvre et mon exemple pourrait-il être évalué comme je veux il. Je solution de l'équation différentielle sous forme de ParametricNDSolve (je crois que la forme exacte de l'équation est hors de propos):Mathematica: FindFit pour NIntegrate de 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}] 

Après que je suis en train de construire une fonction pour FindFit ou d'une procédure similaire, Nintegrating sur la fonction n [ a, b, c, g, f, y, t] j'ai ci-dessus avec un certain multiplicateur (I ai choisi Log [z] comme multiplicateur pour la simplicité)

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]}] 

J'ont NIntegrate sur ma fonction n [ params, t] dérivé de ParametricNDSolve avec multiplicateur introduisant la nouvelle variable (z) qui est également présente dans les limites de l'intégration (sous la même forme que i n multiplicateur pour la simplicité de l'exemple)

Je suis capable d'évaluer les valeurs de ma fonction Func en tout point (z) avec des valeurs données de paramètres (a, b, c, g, f): Func (0,1 2,3,4,5) pourrait être évalué. Mais pour certaines raisons, je ne peux pas utiliser FindFit comme ça:

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

L'erreur est: NIntegrate :: nlim: y = Log [z] n'est pas une limite valable d'intégration.

J'ai essayé beaucoup de combinaisons différentes d'utilisation de? NumericQ et tout semble ne mener nulle part. Toute aide serait appréciée! Merci d'avance et désolé pour l'anglais pur dans l'explication du problème.

Répondre

0

Voici une façon de définir votre fonction:

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]}] 

test: Func[2, .45, .5, .13, .12, .2] -> 0,106107

Je ne suis pas optimiste, vous obtiendrez de bons résultats de FindFit avec une fonction avec tant de paramètres et ce qui est si coûteux en calcul.

+0

Merci! Mais je peux évaluer la fonction Func même sans introduire les variables? NumericQ et ces variables ne m'aident pas non plus à obtenir FindFit - l'erreur NIntegrate reste. Vous avez également raison sur les coûts de calcul d'une telle méthode, mais j'aurai besoin que cela soit fait plusieurs fois pour mes données expérimentales et je ne veux pas écrire moi-même un algorithme Fitting - je crois que ce sera encore plus lent. – user3575511

+0

assurez-vous d'effacer les anciennes définitions. Cette erreur est due à 'NIntegrate' en cours d'évaluation avec' z' symbolique. – agentp