Comment intégrer cette fonction encombrante par morceaux?


1

Je possède ce système d'équation:

kt = Sqrt[h/(π (y1 - y2))]*Integrate[p[y]*Sqrt[(1 + y)/(1 - y)], {y, -1, 1}] 
kb = Sqrt[h/(π (y1 - y2))]*Integrate[p[y]*Sqrt[(1 - y)/(1 + y)], {y, -1, 1}] 

dans laquelle: y1 et y2 sont deux variables que je dois trouver, -1<y2<0, 0<y1<1 et y1 et y2 sont réels.

Le problème est que p[y] est une fonction par morceaux et est défini par:

p[y] := Piecewise[{ 
    {p + a*(y1 + y2)/2 - a*2 h y/(y1 - y2) - t1, y2 < y < y1}, 
    {p + a*(y1 + y2)/2 - a*2 h y/(y1 - y2) - t2, y1 < y < 1}, 
    {p + a*(y1 + y2)/2 - a*2 h y/(y1 - y2) - t3, -1 < y < y2}}] 

dans laquelle: a, p, t1, t2, t3, h sont des constantes.

Je dois trouver y1 et y2 de telle sorte que:

kt==c1&&kb==c2 

c1 et c2 sont deux constantes.

J'avais essayé de résoudre cette intégration manuellement et la réponse était longue et impliquait les équations trigonométriques inverses. J'ai également essayé d'utiliser Solve, NSolve, Reduce, FindInstance et NIntegrate mais Mathematica se bloque généralement. Puisque je dois résoudre ce système d'équations à plusieurs reprises, je veux vraiment savoir comment puis-je effectuer ces calculs en Mathematica automatiquement?

  0

Vous besoin d'un trait de soulignement pour définir une fonction, comme 'p [y_]'. 24 août. 132013-08-24 07:45:37

1

Vous avez certaines hypothèses concernant les valeurs de y1 et y2 mais vous n'avez pas dit Mathematica à leur sujet. Si vous fournissez ces hypothèses Integrate, l'intégration symbolique se déroule sans problème (en quelques minutes):

kt = Sqrt[h/(π (y1 - y2))] Integrate[p[y] Sqrt[(1 + y)/(1 - y)], {y, -1, 1}, 
    Assumptions -> {0 < y1 < 1, -1 < y2 < 0}]; 

kb = Sqrt[h/(π (y1 - y2))] Integrate[p[y] Sqrt[(1 - y)/(1 + y)], {y, -1, 1}, 
    Assumptions -> {0 < y1 < 1, -1 < y2 < 0}]; 

Vous pouvez ensuite fournir des valeurs pour les paramètres et obtenir un résultat en utilisant FindRoot:

Block[{a = 1, p = 2, t1 = 3, t2 = 4, t3 = 5, h = 6, c1 = -30, c2 = 15}, 
FindRoot[{kt == c1, kb == c2}, {y2, -0.5}, {y1, 0.5}]] 

(* {y2 -> -0.245106, y1 -> 0.801993} *) 
  0

: Cela fonctionne. Mais, pourriez-vous expliquer l'idée élégante de spécifier les domaines de 'y1' et' y2'? Je ne comprends toujours pas. Et pourquoi demandez-vous 'Mathematica' de commencer à chercher des solutions près du point' {-0.5,0.5} '? Y a-t-il une raison spécifique à cela? 24 août. 132013-08-24 23:03:24

  0

@ThanhSon, eh bien si vous faisiez l'intégrale à la main, vous le diviseriez probablement en intégrales de -1 à y2, y2 à y1 et y1 à 1, en utilisant la partie appropriée de p [y] pour chacun. Vous ne pouvez le faire que si vous savez que '-1 <y2 <y1 <1'. Je m'attends à ce que * Mathematica * utilise l'information de la même manière. 'FindRoot' a besoin d'une valeur de départ pour chaque paramètre, donc j'ai simplement choisi le milieu du domaine pour chacun. Vous pouvez également dire 'FindRoot' le domaine de chaque paramètre comme' {y2, -0.5, -1, 0} 'mais cela ne semble pas nécessaire dans ce cas. 25 août. 132013-08-25 09:23:15