?? smartytbj.m
字號:
function [node,err] = SmartYTBJ(func,a,b,y_s,y_e,maxtol)
format long;
node(1) = a;
node(2) = b;
num = 2;
if(b-a)<10
n = 5;
else
n = 10;
end
err = 0;
bSign = 1;
while (bSign)
bSign = 0;
for l=1:num
y(l) = subs(subs(sym(func), findsym(sym(func)),node(l)));
end
knode = node;
tnum = num;
insert_num = 0;
for i=1:(tnum-1)
pfx = ThrSample1(knode,y,y_s,y_e,((knode(i)+knode(i+1))/2));
%上式給出每個分段區間上的樣條插值函數
[mx,mv] = FindMX(func,pfx,knode(i),knode(i+1),n);
%找到區間[knode(i),knode(i+1)]上的誤差最大的點
if mv > maxtol
%如果誤差超過給定精度,在此點將區間[knode(i),knode(i+1)]分為兩段,即將此點加
%入結點數組中
d(1:(i+insert_num)) = node(1:(i+insert_num));
d(i+insert_num+1) = mx;
num = num+1;
d((i+insert_num+2):num) = node((i+insert_num+1):(num-1));
node = d;
bSign = 1;
insert_num = insert_num + 1;
else
if(mv>err)
err = mv; %記錄所有樣條插值區間上的最大誤差
end
end
end
end
format short;
function [max_x,max_v] = FindMX(func,pfx,a,b,n)
format long;
eps = 1.e-3;
max_v = 0;
max_x = a;
fa = subs(sym(func), findsym(sym(func)),a); %左端點函數值
fb = subs(sym(func), findsym(sym(func)),b); %右端點函數值
step = n/5;
tol = 1;
tmp = 0;
while tol>eps
t = a;
for j=0:(n/step) %此循環找出取最大值的x
t = a + j*step*(b-a)/n;
pt = subs(sym(pfx), findsym(sym(pfx)),t); %樣條插值得出的函數值
ft = subs(sym(func), findsym(sym(func)),t);
if abs(ft-pt)>max_v %abs(f(x)-p(x))
max_v = abs(ft-pt); %記錄最大誤差
max_x = t; %記錄此點坐標
end
end
tol = abs(max_x-tmp);
tmp = max_x;
step = step/2;
end
format short;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -