function [np,dp]=pdefcn(fun,r,m,n)
%有理多项式pade近似
%
%输入参数 -fun 需要进行pade近似的函数,必须是符号变量
% -r 分子多项式采用的级数
% -m 分母多项式采用的阶数
% -n 对目标函数进行taylor展开使用的阶数,默认10
%注意:n>=m+r+1
%输出参数 -np pade近似的分子多项式系数
% -dp pade近似的分母多形式的系数
%
%Example
%>>fun='exp(-2*x)';
%>>pdefcn(fun,0,5,10)
%rewrite by dynamic
%more information http://www.matlabsky.cn
%2009.1.10
if nargin<4,n=10;end
c=taylor(fun,n);
c=sym2poly(c);
c=c(end:-1:1);
w=-c(r+2:m+r+1)';
vv=[c(r+1:-1:1)';zeros(m-1-r,1)];
W=rot90(hankel(c(m+r:-1:r+1),vv));
V=rot90(hankel(c(r:-1:1)));
x=[1 (W\w)'];
y=[1 x(2:r+1)*V'+c(2:r+1)];
dp=x(m+1:-1:1)/x(m+1);
np=y(r+1:-1:1)/x(m+1);
figure('name','Pade Demo——by Matlabsky','numbertitle','off')
ezplot(fun,[0 10]);
hold on
xx=1:0.1:10;
yy=polyval(np,xx)./polyval(dp,xx);
plot(xx,yy,'r:')
legend('精确图','近似图')
xlabel('x')
ylabel('y')
exp(-2*x)
n =
3.7500
m =
1.0000 2.5000 5.0000 7.5000 7.5000 3.7500