---
title: 數學軟體實作 - Approximating functions
tags: 2020 Fall - 數學軟體實作
GA: G-77TT93X4N1
---
# Lecture - Approximating functions
## Approximating functions
多項式事實上是一個很好的函數, 我們完全知道他的微分以及積分.
所以通常任意一個函數我們會想要把它以多項式取代. 然後我們以此多項式的微分積分來估計原函數的微分積分值.
---
而事實上在分析導論這門課中也知道, 有以下這個定理告訴我們這樣的多項式一定找得到, 而且跟原函數的距離可以任意小:
## Weierstrass Approximation Theorem:
> If $f$ is continuous on $[a, b]$ and if $\epsilon>0$, then there is a polynomial $p$ satisfying $\|f(x)-p(x)\| \le \epsilon$ on the interval $[a, b]$.
---
Question: 以上定理中的 $\|f(x)-p(x)\|$ 是怎麼定義的?
#### Exercise
任意給定兩個函數 $f(x)$, $g(x)$, $x\in[a, b]$, 計算出 $\|f(x)-g(x)\|$.
---
#### Exercise
試求出一個最佳的多項式 $P_N(x)$ 來取代 $f(x)=\sin(x)$, $x\in[0, 1]$.
##### Possible idea 1:
* 均勻在 $[0,1]$ 取點, 並得到 $(x_i, f(x_i)), i=1,\cdots,N$. 利用 `polyfit` 找到一個多項式*通過*或*逼近*這些點. 並以此多項式來當 $P_N(x)$.
* 隨機在 $[0,1]$ 取點, 並得到 $(x_i, f(x_i)), i=1,\cdots,N$. 利用 `polyfit` 找到一個多項式*通過*或*逼近*這些點. 並以此多項式來當 $P_N(x)$.
Question 1: $P_N(x)$ 與 $f(x)$ 的距離有多遠?
$$
\|P_N(x)-f(x)\|_{\infty} = \max_{x\in[0.1]}\{|P_N(x)-f(x)|\}
$$
Question 2: $P_N'(x)$ 與 $f'(x)$ 的距離有多遠?
Question 3: 任意給 $\epsilon>0$, 要如何找到 $P_N(x)$?
---
[Runge's phenomenon](https://en.wikipedia.org/wiki/Runge%27s_phenomenon)
> 均勻取點無法收斂
$$
f(x) = \frac{1}{1+25x^2}, \quad -1\le x\le 1
$$
![Runge](https://upload.wikimedia.org/wikipedia/commons/0/0a/Runge_phenomenon.svg =450x450)
```matlab=
function InterpolateRungeFunction2
% Select interpolation points by right clicking.
% When you get bored, left or double click to finish.
F = @(x) 1./(1+25*x.^2);
% initialise
x = [];
t = linspace(-1, 1, 1000);
LW = 'LineWidth'; MS = 'MarkerSize';
fv = F(t);
afv = max(fv)+1;
ifv = min(fv)-1;
% loop
figure
plot(t,fv,'-k',LW,2);
axis([-1 1 ifv afv])
hold on
h1 = plot(t, fv, '-b', LW, 2);
h2 = plot(t, F(t)*0, '-r', LW, 2);
shg
legend('original function', 'interpolant', 'difference')
while 1 % keep clicking!
if ( ~isempty(x) )
plot(x,F(x),'.b',MS,20,'HandleVisibility','off') % plot interpolation points
plot(x,0,'*k',MS,6,'HandleVisibility','off') % plot x values alone
p = polyfit(x, F(x), length(x)-1);
f = polyval(p, t);
h1.YData = f;
h2.YData = f-fv;
axis([-1 1 ifv afv])
drawnow
shg
end
[gx, ~, button] = ginput(1); % input new interpolation point
if ( button == 3 ) break, end % if right button, stop
x = unique([x; gx]); % #ok<AGROW>
end
end
```
---
#### Assignment
讓使用者任意在螢幕上按順序以滑鼠指定六個點, 並將此六點以直線連線. 找到一條多項式曲線 $\gamma(t)=(P_1(t), P_2(t))$ 使此多項式曲線**很接近**六點的直線連線.