crosslang/Lab7Interp.m
Maximus Gorog 4b6fcec565 Add SymPy bridge and migrate DSL to brace-block syntax.
Symbolic computation via a persistent Python subprocess: new `.sym`
Value variant carries (srepr, pretty), `OctiveLean.SymPyBridge` owns
the subprocess and round-trips expressions, and `evalBinOp`/unary
negation route through SymPy when either operand is `.sym`.  Corpus
adds sym_basic, sym_solve_simplify, sym_calc; demos add Lorenz,
Van der Pol, gravity, SymToolboxDemo, Lab7Interp.

DSL surface changes from `octave! ... octave_end` to `octave! { ... }`.
RosettaStone rewritten against the new syntax; PlotDemo updated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 02:58:50 -06:00

92 lines
2.9 KiB
Matlab

% Lab 7: Polynomial interpolation of f(x) = 1/(1+x^2) on [-5, 5]
% Numerical demo (no plots): each part reports max|f(t) - fit(t)|
% sampled on t = -5:0.01:5.
f = @(x) 1 ./ (1 + x .^ 2);
t = -5:0.01:5;
yt = f(t);
% =========================================================================
% Part 1 - Full-degree polynomial interpolation at uniform nodes
% =========================================================================
disp("Part 1: uniform nodes, polyfit(x, y, n) - interpolation");
ns = [3 6 11 15];
for k = 1:length(ns)
n = ns(k);
xn = linspace(-5, 5, n+1);
yn = f(xn);
c = polyfit(xn, yn, n);
yp = polyval(c, t);
err = max(abs(yt - yp));
printf(" n+1 = %3d degree n = %2d max error = %.4f\n", n+1, n, err);
endfor
% =========================================================================
% Part 2 - Least-squares polynomial fit (k < n) at 12 uniform nodes
% =========================================================================
disp(" ");
disp("Part 2: least-squares polyfit(x, y, k) with k < 11 on 12 nodes");
xn = linspace(-5, 5, 12);
yn = f(xn);
for k = 1:9
c = polyfit(xn, yn, k);
yp = polyval(c, t);
err = max(abs(yt - yp));
printf(" degree k = %d max error = %.4f\n", k, err);
endfor
% =========================================================================
% Part 3 - Natural cubic spline interpolation at 12 uniform nodes
% =========================================================================
disp(" ");
disp("Part 3: cubic spline at 12 uniform nodes");
xn = linspace(-5, 5, 12);
yn = f(xn);
ys = spline(xn, yn, t);
err = max(abs(yt - ys));
printf(" spline(12 nodes) max error = %.6f\n", err);
% Also try other counts
for k = 1:length(ns)
n = ns(k);
xn = linspace(-5, 5, n+1);
yn = f(xn);
ys = spline(xn, yn, t);
err = max(abs(yt - ys));
printf(" spline(%2d nodes) max error = %.6f\n", n+1, err);
endfor
% =========================================================================
% Part 4 - Chebyshev nodes for full-degree interpolation
% =========================================================================
disp(" ");
disp("Part 4: Chebyshev nodes - polyfit(x, y, n) - interpolation");
a = -5; b = 5;
for k = 1:length(ns)
n = ns(k);
zn = zeros(1, n+1);
for j = 0:n
zn(j+1) = (a+b)/2 + (a-b)/2 * cos(pi*j/n);
endfor
yn = f(zn);
c = polyfit(zn, yn, n);
yp = polyval(c, t);
err = max(abs(yt - yp));
printf(" n+1 = %3d degree n = %2d max error = %.4f\n", n+1, n, err);
endfor
% =========================================================================
% Part 5 - Spline at varied node counts (already partially shown)
% =========================================================================
disp(" ");
disp("Part 5: spline error vs node count (uniform)");
counts = [4 7 12 16 25 50];
for k = 1:length(counts)
m = counts(k);
xn = linspace(-5, 5, m);
yn = f(xn);
ys = spline(xn, yn, t);
err = max(abs(yt - ys));
printf(" %2d nodes max error = %.6f\n", m, err);
endfor