Précision sur FindRoot

Sep 10 2020

J'essaye de résoudre un système d'équation non linéaire, et quand je le résolve, j'ai le message suivant

FindRoot::lstol: La recherche de ligne a réduit la taille du pas à l'intérieur de la tolérance spécifiée par AccuracyGoalet PrecisionGoalmais n'a pas pu trouver une diminution suffisante de la fonction de mérite. Il se peut que vous ayez besoin de plus de chiffres de précision de travail MachinePrecision pour respecter ces tolérances.

En raison du manque de précision, je ne suis pas sûr de mon résultat et changer les itérations et la précision ne change rien.

Voici mon code:

E1 = 0.53*10^9;
k1 = 0.269*10^(-6);
K1 = 0.5;
α1 = 30*10^(-6);
ν1 = 0.25;
μ1 = E1/(2 (1 + ν1));

E2 = 125*10^9;
k2 = 12.98*10^(-6);
K2 = 54;
α2 = 12*10^(-6);
ν2 = 0.5;
μ2 = E2/(2 (1 + ν2));
k = k1/k2;
K = K1/K2;
α = α1 (1 + ν1)/(α2 (1 + ν2));
f = 0.4;

ξ1[c1_] := Sqrt[0.5 (1 + Sqrt[1 + (c1/k)^2])];
ξ2[c2_] := Sqrt[0.5 (1 + Sqrt[1 + (c2)^2])];
η1[c1_] := -Sqrt[0.5 (-1 + Sqrt[1 + (c1/k)^2])];
η2[c2_] := Sqrt[0.5 (-1 + Sqrt[1 + c2^2])];
H1asym[A_] := 
  2 *μ1* μ2* 
   k2* α2* (1 + ν2)/ (K2 (μ2 (1 - ν1) (-A Csch[
              A]^2 + Coth[A]) + μ1 (1 - ν2) Coth[A]^2));
H2asym[A_] := 
  4*μ1 *μ2 *
   k2 *α2 *(1 + ν2)/(K2 (μ2 (1 - 
           2 ν1) (-A Csch[A]^2 + Coth[A]) - μ1 (1 - 
           2 ν2) Coth[A] - μ1 A Csch[A]^2));
Hasym[A_] := H1asym[A] / H2asym[A]; 

M1 [ c2_, 
   A_] := (ξ2 [c2] Sinh[2 A ξ2[c2]] + η2[c2] Sin[
       2 A η2[c2]])/(Cosh[2 A ξ2[c2]] - Cos[2 A η2[c2]]);
M2[c2_, A_] := (η2[c2] Sinh[2 A ξ2[c2]] - ξ2[c2] Sin[
       2 A η2[c2]])/(Cosh[2 A ξ2[c2]] - Cos[2 A η2[c2]]);
M3[c1_, A_] := α (- A Csch[A]^2 + Coth[A])/ ξ1[c1];
M4[c2_, A_] := (Coth[
      A]/(ξ2[c2] η2[c2])) (η2[c2] Sinh[
        2 A ξ2[c2]] - ξ2[c2] Sin[2 A η2[c2]])/(Cosh[
       2 A ξ2[c2]] - Cos[2 A η2[c2]]);
N1[c2_, A_] := ( -ξ2[c2] Sin[2 A η2[c2]] + η2[c2] Sinh[
       2 A ξ2[c2]])/ (Cosh[2 A ξ2[c2]] - Cos[2 A η2[c2]]);
N2[c2_, A_] := (ξ2[c2] Sinh[2 A ξ2[c2]] + η2[c2] Sin[
       2 A η2[c2]])/(Cosh[2 A ξ2[c2]] - Cos[2 A η2[c2]]);
N3[c1_, A_] := ( α η1[
       c1] / (ξ1[c1] (ξ1[c1] + 1))) (-A Csch[A]^2 + Coth[A]);
N4[c2_, A_] := (Coth[
     A]/ (ξ2[c2] η2[
       c2])) ((ξ2[c2] Sinh[2 A ξ2[c2]] + η2[c2] Sin[
        2 A η2[c2]] - 
      Coth[A] (Cosh[2 A ξ2[c2]] - Cos[2 A η2[c2]]))/(Cosh[
       2 A ξ2[c2]] - Cos[2 A η2[c2]]))

V[c1_, c2_] := c1 - c2;
equation76 [c1_, c2_, A_] := 
  K ξ1[c1] + M1[c2, A] + 
    f Hasym[A] (K η1[c2] + M2[c2, A] ) -  
    f H1asym[A]/2 (M3[c1, A] + M4[c2, A])*(V[c1, c2]) == 0;

equation77[c1_, c2_, A_] := 
  K η1[c2] + N1[c2, A] - f Hasym[A] (K ξ1[c1] + N2[c2, A]) + 
    f H1asym[A]/2 (N3[c1, A] + N4[c2, A]) * (V[c1, c2]) == 0;

solasym[A_] := 
 FindRoot[{equation76[c1, c2, A], 
   equation77[c1, c2, A]}, {{c1, 10000}, {c2, 2}}, 
  MaxIterations -> 10000] 
Table[FindRoot[{equation76[c1, c2, A], 
   equation77[c1, c2, A]}, {{c1, 10000}, {c2, 2}}, 
  MaxIterations -> 10000] , {A, 0.1, 6 , .1}]
 

ListLinePlot[Table[{A, A*V[c1, c2] /. solasym[A]}, {A, 0.1, 6, .01}], 
  ScalingFunctions -> "Log"] // Quiet

Avez-vous une idée de la façon dont je peux obtenir une meilleure précision?

Merci beaucoup

Réponses

1 DanielHuber Sep 11 2020 at 01:23

J'utilise MMA 12.1. Si j'exécute votre code, je ne reçois aucun message d'erreur. En conséquence, j'obtiens l'intrigue suivante: