Mathematica8: Нахождение максимального значения разности двух функций на [-1,1] - PullRequest
2 голосов
/ 27 января 2011

У меня есть две приближенные функции, и я хочу найти максимальное значение (погрешность) между их графиками, чтобы увидеть, насколько они приближаются. Я использовал : FindMaximum [Abs [f [x] - p [x]], x], но Mathematica 8 дала мне такой вывод: {2.75612 * 10 ^ 104, {x -> 2.75612 * 10 ^ 104}}

что это значит? Это слишком большой!

Можете ли вы предложить мне лучший способ?

Спасибо

Ответы [ 4 ]

3 голосов
/ 27 января 2011

Трудно сказать, не зная ваших функций, но я предполагаю, что позиция найденного максимума находится далеко за пределами вашей предполагаемой области. Вы можете добиться большего успеха, используя другую форму или FindMaximum, а именно

FindMaximum[Abs[f[x] - p[x]],{x,x0,xmin,xmax}]

где x0 будет вашим первоначальным предположением (может быть любой точкой внутри интересующей области), а xmin,xmax - конечной точкой вашей интересующей области.

2 голосов
/ 28 января 2011

Возможно, причина в том, что сказал Леонид. Чтобы посмотреть, что FindMaximum делает в реальном времени, вы можете сделать

f[x_] := Sin[x];
p[x_] := x^2;
lst = {};
Monitor[
 FindMaximum[Abs[f[x] - p[x]], x, 
  EvaluationMonitor :> (AppendTo[lst, x]; Pause[.01])
  ], ListPlot[lst, PlotRange -> Full]
 ]

вертикальная ось на результирующем графике - это координата x, которую FindMaximum в данный момент просматривает. Как только FindMaximum будет сделан, график исчезнет; список хранится в lst, так что вы можете, например, ListPlot.

Вы также можете попробовать это с {Abs[f[x] - p[x]], -1 <= x <= 1} в качестве аргумента, как предложил Спенсер Нельсон, чтобы увидеть, как тогда идет поиск.

1 голос
/ 27 января 2011

Это, вероятно, вызвано каким-то переполнением в одной из двух функций, когда входное значение x очень большое.Вы должны ограничить свой домен [-1, 1]:

FindMaximum[{Abs[f[x] - p[x]], -1 <= x <= 1}, x]
0 голосов
/ 28 января 2011

Если вы хотите найти глобальный максимум в пределах интервала {a, b}, я предлагаю NMaximize :

NMaximize[{Abs[f[x] - p[x]], a <= x <= b}, x].

Обратите внимание, что FindMaximum ищет любой локальный максимум, что хорошо, если вы знаете, что для вашей конкретной функции локальный максимум также будет глобальным максимумом.

Вместо целевой функции Abs[f[x] - p[x]] вы можете использовать целевую функцию (f[x] - p[x])^2. Это сделало бы целевую функцию гладкой (если f[x] и p[x] гладкие), что может помочь повысить эффективность некоторых методов численной оптимизации.

...