科研日常小节 6.15
matlab求解一阶和二阶导:
(1)数值方法
for i = 1
d2ydx2(i) = (y(i+2)+y(i)-2*y(i+1))/power((x(i+2)-x(i))/2,2);
end
for i = 2:n-1
d2ydx2(i) = 2/(x(i+1)-x(i-1))*((y(i+1)-y(i))/(x(i+1)-x(i))-(y(i)-y(i-1))/(x(i)-x(i-1)));
end
for i = n
d2ydx2(i) = (y(i)-2*y(i-1)+y(i-2))/power((x(i)-x(i-2))/2,2);
end
(2)多项式
y1 = polyfit(x,y,3);
x_ = linspace(0,1);
y_ = polyval(y1,x_);
x1 = x;
syms x1 f(x)
f(x1) = poly2sym(y1,x1);
f2(x1) = diff(f(x1), x1, 2);
(3)三次样条
pp = csape(x, y);
pp1 = fnval(fnder(pp, 1), x); %求一阶导
pp2 = fnval(fnder(pp, 2), x); %求二阶导
建议使用spline函数做插值,结合diff函数做高阶导求解,当点数较少时,不建议使用数值解法


matlab读取字母、数字、标点符号混合数据中的数字,使用正则表达式比较简单:
s=regexp(str,'\-?\d*\.?\d*','match');