2017-01-25 22 views
1

Я использую алгоритм Newton Raphson + next Substitute для выполнения вычисления флэш-памяти (имитация химического процесса).Почему алгоритм терпит неудачу при увеличении точности числа? Как можно уменьшить чувствительность алгоритма до точности числа?

Алгоритм может хорошо сходиться, когда вход находится в низкой точности, например 0,1, но при увеличении точности числа до 0,11111 или 0,99999. Алгоритм не сходится.

Когда я использую метод квази-Ньютона с обновлением BFGS, та же проблема возникает снова. Как можно уменьшить чувствительность кода к числовой точности?

Вот простой пример использования Matlab для решения уравнения Рахфорда-Райса. Когда comp_overall = [0,9,1-0,9], он сходится хорошо. Однако, когда точность числа увеличивается, как [0,99999,1-0,99999]. Он не сходится.

K=[0.053154011443159 34.234731216532658], 
comp_overall= [0.99999 1- 0.99999], phi=0.5; %initial values 
epsilon = 1.0; 
iter1 = 1; 
while (epsilon >=1.e-05) 
    rc=0.0; 
    drc=0.0; 
    for i=1:2 
    % Rachford-Rice Equation 
    rc = comp_overall(i)*(K(i)-1.0)/(1.0+phi*(K(i)-1.0))+rc; 
    % Derivative 
    drc = comp_overall(i)*(K(i)-1.0)^2/(1.0+phiK(i)-1.0))^2+drc; 
    end 
    % Newton-Raphson 
    phi1 = phi +0.01 (rc/drc); 
    epsilon = abs((phi1-phi)/phi); 
    % Convergence 
    phi = phi1; 
    iter1=iter1+1; 
end 
+0

Вы имели в виду [Newton-Raphson] (https://en.wikipedia.org/wiki/Newton's_method)? – tar

+3

Вам нужно будет опубликовать код. Фактический алгоритм сходится обязательно так. Но в основном у вас есть ошибка в вашем коде где-то, что вызывает у него проблемы. – Tatarize

ответ

1

Метод Ньютона-Рафсона основан на дифференцируемости функции между любыми двумя последовательными приближениями. В зависимости от выбора начального значения это может быть не для z₁ = 0.99999. Давайте посмотрим на график функции Рэкфорда-Райса:

Rachford-Rice function

Корень этой функции φ₀ ≈ –0.0300781429 и ближайшая точка разрыва –1/(K₂-1) ≈ –0.0300890052. Они достаточно близки, чтобы метод Ньютона-Рафсона перескочил, чтобы перепрыгнуть через этот разрыв.

Например:

  • φ₁ = –0.025
  • f(φ₁) ≈ -0.9229770571
  • f'(φ₁) ≈ 1.2416569960
  • φ₂ = φ₁ + 0.01 * f(φ₁)/f'(φ₁) ≈ -0.0324334302
  • φ₂ лежит слева от разрыва, так что следующие шаги будут от, а не по направлению к корень.
  • φ₃ = -0.0358986759 < φ₂

Что можно сделать по этому поводу:

  1. Когда алгоритм не сходится, повторите его с меньшими шагами. Например, начните с коэффициента 0,01 (как сейчас) и уменьшите его 10 раз после каждого отказа.
  2. Обнаружение перерегулирования. На каждой итерации проверяйте, есть ли точка разрыва (–1/(Kᵢ-1)) между текущим приближением и предыдущим. Когда это произойдет, отбросьте текущее приближение, уменьшите коэффициент и продолжайте.
  3. Ограничить область поиска. Являются ли решения вне [0, 1] физически значимыми? Если нет, вы можете остановиться, как только приблизительное значение выпадет из этого диапазона.
  4. Используйте другой способ. Функция монотонна на любом интервале между двумя последовательными точками разрыва, поэтому вы можете выполнять бинарный поиск на каждом таком интервале. Это будет быстрее и надежнее, чем метод Ньютона-Рафсона.
+0

Привет, Большое спасибо за ваш ответ. Для ваших предложений, перечисленных выше, я уже пробовал некоторые из них. Подобно уменьшению длины итеративного шага или добавлению метода поиска линии, результаты не так удовлетворяют. Теперь я пытаюсь более сложный метод, такой как алгоритм Ньютона-Гаусса или метод остаточного градиента. –