- 积分
- 83
- 注册时间
- 2003-11-14
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2008-1-27 01:57:27
|
显示全部楼层
来自 新疆乌鲁木齐
应该可以尝试使用样条求导命令fnder计算,具体请查帮助。但是它的算法不是中心差分,样条类命令的算法好像要复杂一点儿。
中心差分算法在薛定宇的《高等应用数学问题的MATLAB求解》书中有代码(四阶代数精度):-
- function [dy,dx]=diff_ctr(y, Dt, n)
- yx1=[y 0 0 0 0 0]; yx2=[0 y 0 0 0 0]; yx3=[0 0 y 0 0 0];
- yx4=[0 0 0 y 0 0]; yx5=[0 0 0 0 y 0]; yx6=[0 0 0 0 0 y];
- switch n
- case 1
- dy = (-diff(yx1)+7*diff(yx2)+7*diff(yx3)-diff(yx4))/(12*Dt); L0=3;
- case 2
- dy=(-diff(yx1)+15*diff(yx2)-15*diff(yx3)+diff(yx4))/(12*Dt^2);L0=3;
- case 3
- dy=(-diff(yx1)+7*diff(yx2)-6*diff(yx3)-6*diff(yx4)+...
- 7*diff(yx5)-diff(yx6))/(8*Dt^3); L0=5;
- case 4
- dy = (-diff(yx1)+11*diff(yx2)-28*diff(yx3)+28*diff(yx4)-...
- 11*diff(yx5)+diff(yx6))/(6*Dt^4);L0=5;
- end
- dy=dy(L0+1:end-L0); dx=([1:length(dy)]+L0-2-(n>2))*Dt;
- dy=dy(L0+1:end-L0); dx=[0:length(dy)-1]*Dt;
复制代码
测试代码:
- h=0.05; x=0:h:pi; syms x1; y=sin(x1)/(x1^2+4*x1+3);
- yy1=diff(y); f1=subs(yy1,x1,x); % 求各阶导数的解析解与对照数据
- yy2=diff(yy1); f2=subs(yy2,x1,x); yy3=diff(yy2); f3=subs(yy3,x1,x);
- yy4=diff(yy3); f4=subs(yy4,x1,x);
- y=sin(x)./(x.^2+4*x+3); % 生成已知数据点
- [y1,dx1]=diff_ctr(y,h,1); subplot(221),plot(x,f1,dx1,y1,':');
- [y2,dx2]=diff_ctr(y,h,2); subplot(222),plot(x,f2,dx2,y2,':')
- [y3,dx3]=diff_ctr(y,h,3); subplot(223),plot(x,f3,dx3,y3,':');
- [y4,dx4]=diff_ctr(y,h,4); subplot(224),plot(x,f4,dx4,y4,':')
- norm((y4-f4(4:60))./f4(4:60))
复制代码 至于gradient命令,记得好像以前见过一个解释的例子,应该也是在薛定宇的书中,说明其结果并不是真正的微分结果,还要具体除以网格点步距。
[ 本帖最后由 bainhome 于 2008-1-27 02:01 编辑 ] |
评分
-
1
查看全部评分
-
|