Как построить график сходимости итерационного метода?

Это сообщение об ошибке запускается, когда отправляется сообщение перед отправкой заголовков HTTP (с помощью setcookie или header ). Общие причины вывода чего-либо перед заголовками HTTP:

  • Случайные пробелы, часто в начале или в конце файлов, например:
     
    

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Чтобы избежать этого, просто оставьте закрытие ?> - это не обязательно. g2] в начале файла php. Изучите ваши php-файлы с помощью шестнадцатеричного редактора, чтобы узнать, так ли это. Они должны начинаться с байтов 3F 3C. Вы можете безопасно удалить спецификацию EF BB BF с начала файлов.

  • Явный вывод, например вызовы echo, printf, readfile, passthru, код до и т. д.
  • Предупреждение, выданное php, если установлено свойство display_errors php.ini. Вместо того, чтобы сбой при ошибке программиста, php молча фиксирует ошибку и выдает предупреждение. Хотя вы можете изменить конфигурации display_errors или error_reporting , вы должны скорее исправить эту проблему. Основными причинами являются доступ к неопределенным элементам массива (например, $_POST['input'] без использования empty или isset , чтобы проверить, установлен ли вход) или используя неопределенная константа вместо строкового литерала (как в $_POST[input], обратите внимание на недостающие кавычки).
  • Включение буферизации вывода должно устранить проблему; все выходные данные после вызова ob_start буферизуются в памяти до тех пор, пока вы не отпустите буфер, например. с ob_end_flush .

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

    0
    задан Arata Kaizaki 16 January 2019 в 20:43
    поделиться

    2 ответа

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

    Кроме того, я изменил маркер с '.' на 'o' для лучшей видимости.

    Вы также можете включить drawnow (и, возможно, подходящий pause) после каждого plot, чтобы рисунок был немедленно обновлен. Это полезно, если вы хотите, чтобы линия, обозначенная маркерами, «росла».

    f = @(x) (x).^2 - 10;
    f_deriv = @(x) 2*x;
    x0 = 1;
    x_true = sqrt(10);
    x_save = (x0);
    
    hold on %%% New line
    for jj = 1:20
        plot(jj,abs(x_save(jj)-x_true),'ko'); %%% Modified line
        x_new = x0 - f(x0)/f_deriv(x0);
        x_save(1+jj,1) = x_new;
        x0 = x_new;
    end
    
    xlim([0 20]);
    ylim([0 2.5]);
    xticks(0:20);
    yticks(0:0.1:2.5);
    
    0
    ответ дан Luis Mendo 16 January 2019 в 20:43
    поделиться
    1112 Как вы говорите, часть метода Ньютона работает так, как задумано. Проблема с вашей частью заговора.

    В вашей реализации вы генерируете 1 график за итерацию в цикле for. Это приводит к 20 участкам с 1 очком за участок, что не является желаемым результатом.

    Ниже приведен код для генерации 1 сюжета с 21 точкой.

    f = @(x) (x).^2 - 10;
    f_deriv = @(x) 2*x;
    x0 = 1;
    x_true = sqrt(10);
    x_save = (x0);
    
    for jj = 1:20
        % Don't plot here. Wait until all data is collected.
        x_new = x0 - f(x0)/f_deriv(x0);
        x_save(1+jj,1) = x_new;
        x0 = x_new;
    end
    
    % Plot here. All data has been collected.
    plot(0:20',abs(x_save-x_true),'kx');
    xlim([0 20]);
    ylim([0 2.5]);
    xticks(0:20);
    yticks(0:0.1:2.5);
    

    РЕДАКТИРОВАТЬ: для решения проблемы пропущенных точек с помощью semilogy вместо plot.

    1. Точки отсутствуют, потому что semilogy вычисляет лог значений. log(0) = -Inf
    2. Точность машины приводит к тому, что очень малые числа рассматриваются как ноль.
    3. Точность вычитания с плавающей запятой пропорциональна величине входных данных. Вычитание двух больших чисел имеет низкую точность.

    Ниже приведен пример изменения координат, чтобы избежать вычитания двух больших чисел.

    % Original problem parameters
    x0 = 1;
    x_true = sqrt(10);
    
    % Change of co-ordinates
    % u = x - sqrt(10);
    % f(x) = g(u(x))
    g = @(u) u^2 + 2*x_true*u;
    g_deriv = @(u) 2*u + 2*x_true;
    u0 = x0 - x_true;
    u_save = u0;
    
    for jj = 1:20
        u_new = u0 - g(u0)/g_deriv(u0);
        u_save = [u_save u_new];
        u0 = u_new;
    end
    
    semilogy(0:20, abs(u_save - 0), 'kx')
    xlim([0 20]);
    

    Вы заметите, что точки за 6 итераций по-прежнему исчезают, потому что ошибка все еще меньше точности машины (~ 1e-15). Однако ошибка снова не увеличивается.

    Если вы хотите повысить точность своих вычислений, вы можете обратиться к функции vpa.

    https://www.mathworks.com/help/symbolic/increase-precision-of-numeric-calculations.html

    0
    ответ дан Jonathan Chiang 16 January 2019 в 20:43
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: