1) Обходной путь для «NMaximize» ошибки «неограниченная функция». но не знаю почему 2) что более важно, как ускорить этот 3D-график (см. update2) - PullRequest
2 голосов
/ 19 октября 2011

Когда я пытался найти максимальное значение f, используя NMaximize, mathematica выдала мне ошибку, говорящую

NMaximize::cvdiv: Failed to converge to a solution. The function may be unbounded.

Однако, если я масштабирую f с большим числом, скажем, 10 ^ 5, 10 ^ 10, и даже 10 ^ 100 , NMaximize работает хорошо.

На двух изображениях ниже синий - f, а красный - f/10^10.

А вот и мои вопросы:

  1. Является ли масштабирование общим приемом оптимизации?

  2. Любые другие надежные, общие решения для таких оптимизаций функции в форме иглы?

  3. Поскольку масштабирование почти не изменило форму иглы f, как показано на двух изображениях, как здесь работает масштабирование?

спасибо:)

Обновление1: с f в комплекте

Clear["Global`*"]

d = 1/100;
mu0 = 4 Pi 10^-7;
kN = 97/100;
r = 0.0005;
Rr = 0.02;
eta = 1.3;

e = 3*10^8;

s0 = 3/100;

smax = 1/100; ks = smax/s0;
fre = 1; tend = 1; T = 1;
s = s0*ks*Sin[2*Pi*fre*t];
u = D[s, t];
umax = N@First[Maximize[u, t]];

(*i=1;xh=0.1;xRp=4.5`;xLc=8.071428571428573`;
i=1;xh=0.1;xRp=4.5;xLc=8.714285714285715;*)
i = 1; xh = 0.1; xRp = 5.5; xLc = 3.571428571428571`;
(*i=1;xh=0.1`;xRp=5.`;xLc=6.785714285714287`;*)

h = xh/100; Rp = xRp/100; Lc = xLc/100;
Afai = Pi ((Rp + h + d)^2 - (Rp + h)^2);
(*Pi (Rp-Hc)^2== Afai*)
Hc = Rp - Sqrt[Afai/Pi];
(*2Pi(Rp+h/2) L/2==Afai*)
L = (2 Afai)/(\[Pi] (h + 2 Rp));
B = (n mu0 i)/(2 h);

(*tx = -3632B+2065934/10 B^2-1784442/10 B^3+50233/10 B^4+230234/10 \
B^5;*)
tx = 54830.3266978739 (1 - E^(-3.14250266080741 B^2.03187556833859));

n = Floor[(kN Lc Hc)/(Pi r^2)] ;

A = Pi*(Rp^2 - Rr^2);
b = 2*Pi*(Rp + h/2);

(* -------------------------------------------------------- *)

Dp0 = 2*tx/h*L; 


Q0 = 0;

Q1 = ((1 - 3 (L tx)/(Dp h) + 4 (L^3 tx^3)/(Dp^3 h^3)) Dp h^3)/(
   12 eta L) b;
Q = Piecewise[{{Q1, Dp > Dp0}, {Q0, True}}];


Dp = Abs[dp[t]];


ode = u A - A/e ((s0^2 - s^2)/(2 s0 )) dp'[t] == Q*Sign[dp[t]];

sol = First[
   NDSolve[{ode, dp[0] == 0}, dp, {t, 0, tend} , 
    MaxSteps -> 10^4(*Infinity*), MaxStepFraction -> 1/30]];

Plot[dp''[t] A /. sol, {t, T/4, 3 T/4}, AspectRatio -> 1, 
 PlotRange -> All]
Plot[dp''[t] A /10^10 /. sol, {t, T/4, 3 T/4}, AspectRatio -> 1, 
 PlotRange -> All, PlotStyle -> Red]

f = dp''[t] A /. sol;
NMaximize[{f, T/4 <= t <= 3 T/4}, t]
NMaximize[{f/10^5, T/4 <= t <= 3 T/4}, t]
NMaximize[{f/10^5, T/4 <= t <= 3 T/4}, t]
NMaximize[{f/10^10, T/4 <= t <= 3 T/4}, t]

update2: Вот моя настоящая цель. На самом деле, я пытаюсь сделать следующий 3D-регион. Но я обнаружил, что это очень много времени (более 3 часов), есть идеи, чтобы ускорить этот регион?

Clear["Global`*"]

d = 1/100;
mu0 = 4 Pi 10^-7;
kN = 97/100;
r = 0.0005;
Rr = 0.02;
eta = 1.3;

e = 3*10^8;

s0 = 3/100;

smax = 1/100; ks = smax/s0;
f = 1; tend = 1/f; T = 1/f;
s = s0*ks*Sin[2*Pi*f*t];
u = D[s, t];
umax = N@First[Maximize[u, t]];


du[i_?NumericQ, xh_?NumericQ, xRp_?NumericQ, xLc_?NumericQ] := 
 Module[{Afai, Hc, L, B, tx, n, A, b, Dp0, Q0, Q1, Q, Dp, ode, sol, 
   sF, uF, width, h, Rp, Lc},
  h = xh/100; Rp = xRp/100; Lc = xLc/100;
  Afai = Pi ((Rp + h + d)^2 - (Rp + h)^2);

  Hc = Rp - Sqrt[Afai/Pi];

  L = (2 Afai)/(\[Pi] (h + 2 Rp));
  B = (n mu0 i)/(2 h);


  tx = 54830.3266978739 (1 - E^(-3.14250266080741 B^2.03187556833859));

  n = Floor[(kN Lc Hc)/(Pi r^2)] ;

  A = Pi*(Rp^2 - Rr^2);
  b = 2*Pi*(Rp + h/2);

  Dp0 = 2*tx/h*L;  


  Q0 = 0;

  Q1 = ((1 - 3 (L tx)/(Dp h) + 4 (L^3 tx^3)/(Dp^3 h^3)) Dp h^3)/(
    12 eta L) b;
  Q = Piecewise[{{Q1, Dp > Dp0}, {Q0, True}}];

  Dp = Abs[dp[t]];


  ode = u A - A/e ((s0^2 - s^2)/(2 s0 )) dp'[t] == Q*Sign[dp[t]];

  sol = First[
    NDSolve[{ode, dp[0] == 0}, dp, {t, 0, tend} , MaxSteps -> 10^4, 
     MaxStepFraction -> 1/30]];


  sF = ParametricPlot[{s, dp[t] A /. sol}, {t, 0, tend}, 
    AspectRatio -> 1];


  uF = ParametricPlot[{u, dp[t] A /. sol}, {t, 0, tend}, 
    AspectRatio -> 1];


  tdu = NMaximize[{dp''[t] A /10^8 /. sol, T/4 <= t <= 3 T/4}, {t, 
     T/4, 3 T/4}, AccuracyGoal -> 6, PrecisionGoal -> 6];

  width = Abs[u /. tdu[[2]]];

  {uF, width, B}]

RegionPlot3D[
 du[1, h, Rp, Lc][[2]] <= umax/6, {h, 0.1, 0.2}, {Rp, 3, 10}, {Lc, 1, 
  10}, LabelStyle -> Directive[18]]

f f/10^10

1 Ответ

0 голосов
/ 20 октября 2011

NMaximize::cvdiv выдается, если оптимум улучшился на пару порядков в процессе оптимизации, и конечный результат является «большим» в абсолютном смысле.(Например, чтобы предотвратить сообщение в случае, когда мы переходим от 10 ^ -6 к 1.)

Так что да, масштабирование целевой функции может повлиять на это.

Строгоговоря это сообщение является предупреждением, а не ошибкой.По моему опыту, если вы видите это, есть большая вероятность, что ваша проблема является неограниченной по какой-то причине.В любом случае, это предупреждение является подсказкой о том, что вы можете дважды проверить свою систему, чтобы увидеть, может ли это быть так.

...