[1,2,3]*[1;2;3]
ans =
14
[1,2,3]*[1;2;3]=?
fprintf('realmax = %1.20e\n',realmax)
fprintf('realmin = %1.20e\n',realmin)
fprintf('maximum relative error = %1.20e\n',eps)
realmax = 1.79769313486231570815e+308
realmin = 2.22507385850720138309e-308
maximum relative error = 2.22044604925031308085e-16
s=1;
for i=1:1000
s=s+eps/10;
end
s==1
ans = 1
Set default values in Octave for linewidth and text size
%plot --format svg
set (0, "defaultaxesfontname", "Helvetica")
set (0, "defaultaxesfontsize", 18)
set (0, "defaulttextfontname", "Helvetica")
set (0, "defaulttextfontsize", 18)
set (0, "defaultlinelinewidth", 4)
Define time from 0 to 12 seconds with N
timesteps
function defined as freefall
function [v_analytical,v_terminal,t]=freefall(N)
t=linspace(0,12,N)';
c=0.25; m=60; g=9.81; v_terminal=sqrt(m*g/c);
v_analytical = v_terminal*tanh(g*t/v_terminal);
v_numerical=zeros(length(t),1);
delta_time =diff(t);
for i=1:length(t)-1
v_numerical(i+1)=v_numerical(i)+(g-c/m*v_numerical(i)^2)*delta_time(i);
end
% Print values near 0,2,4,6,8,10,12 seconds
indices = round(linspace(1,length(t),7));
fprintf('time (s)|vel analytical (m/s)|vel numerical (m/s)\n')
fprintf('-----------------------------------------------\n')
M=[t(indices),v_analytical(indices),v_numerical(indices)];
fprintf('%7.1f | %18.2f | %15.2f\n',M(:,1:3)');
plot(t,v_analytical,'-',t,v_numerical,'o-')
end
[v_analytical,v_terminal,t]=freefall(120);
time (s)|vel analytical (m/s)|vel numerical (m/s)
-----------------------------------------------
0.0 | 0.00 | 0.00
2.0 | 18.76 | 18.82
4.0 | 32.64 | 32.80
6.1 | 40.79 | 40.97
8.0 | 44.80 | 44.94
10.0 | 46.84 | 46.93
12.0 | 47.77 | 47.82
We approximated the derivative as
Can reduce error by decreasing step size -> delta_time
Taylor series:
We can approximate the next value in a function by adding Taylor series terms:
Approximation | formula |
---|---|
|
|
|
|
|
|
|
Where
The
In the Freefall example, we estimated the function with a
or the truncation error for a first-order Taylor series approximation is
-
digital representation of a number is rarely exact
-
arithmetic (+,-,/,*) causes roundoff error
fprintf('%1.20f\n',double(pi))
fprintf('%1.20f\n',single(pi))
3.14159265358979311600
3.14159274101257324219