clear; // *** 刻み幅の設定 *** n = [0:1:50]; h = 2 ^ (- n); x = 0.3 * %pi; // *** 微分の近似値 *** // 前進差分 f1 = (sin(x + h) - sin(x)) ./ h; f12 = (sin(x + 2 * h) - sin(x)) ./ (2 * h); // 中心差分 f2 = (sin(x + h) - sin(x - h)) ./ (2 * h); f22 = (sin(x + 2 * h) - sin(x - 2 * h)) ./ (4 * h); // 前進差分に対するRomberg 1段公式 romberg1 = 2 * ((sin(x + h) - sin(x)) ./ h - 0.5 * (sin(x + 2 * h) - sin(x)) ./ (2 * h)); romberg12 = 2 * ((sin(x + 2 * h) - sin(x)) ./ (2 * h) - 0.5 * (sin(x + 4 * h) - sin(x)) ./ (4 * h)); // 中心差分に対するRomberg 1段 romberg2 = ((sin(x + h) - sin(x - h)) ./ (2 * h) - 0.25 * (sin(x + 2 * h) - sin(x - 2 * h)) ./ (4 * h)) / 0.75; romberg22 = ((sin(x + 2 * h) - sin(x - 2 * h)) ./ (4 * h) - 0.25 * (sin(x + 4 * h) - sin(x - 4 * h)) ./ (8 * h)) / 0.75; // *** グラフの軸設定 *** a = gca(); a.data_bounds = [0,1E-14;50,1]; a.log_flags = "nl"; // *** グラフのプロット *** plot(n,abs(f1 - f12),'-sr'); plot(n,abs(f2 - f22),'-sm'); plot(n,abs(romberg1 - romberg12),'-sb'); plot(n,abs(romberg2 - romberg22),'-sg'); // *** グラフの体裁 *** xlabel("n"); ylabel("Err"); legend(['f1(x)','f2(x)','Romberg f1(x)','Romberg f2(x)'],4);