123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- module pade; % Pade' Approximations.
- % Author: Lisa Temme
- % Date: 15/6/95.
- algebraic;
- load taylor;
- load solve;
- %**************
- %%Include a boolean function to check for taylor expression
- procedure taylorp(x);
- lisp eqcar(x,'taylor);
- %% Input my code for the Pade Function
- procedure pade(f, x, h, n, d);
- % f is function to be approximated
- % x is function variable
- % h is point at which approximation is evaluated
- % n is degree (wanted) of numerator of rational function approximation
- % d is degree (wanted) of denominator of rational function approximation
- begin
- scalar y,g,numer,denom, num_var_list, den_var_list, variable_list,
- tay_expsn,tay_output,poly_taylor,coeff_list,j, k, kk, a, b,
- new_list,answer,part_answer,count,zero_check_list,p,q,r;
-
- %check to see if input is rational
- %if so larger degrees of n & d will return input
- if type_ratpoly(f,x) AND deg(num f,x)<=n AND deg(den f,x)<=d
- then return f
- else
- << y := lisp gensym(); %declare y as local variable
- lisp(a:= gensym()); %\ declare
- lisp(b:= gensym()); % | a and b
- lisp eval list ('operator,mkquote list a); % | as local
- lisp eval list ('operator,mkquote list b); %/ operators
-
- g := sub(x=y+h,f); %rewrite f in terms of y at 0
-
- numer := for k:=0:n sum a(k)*y^k;
- denom := for j:=0:d sum b(j)*y^j;
- num_var_list := for k:=0:n collect a(k);
- den_var_list := for j:=0:d collect b(j);
- variable_list := append(num_var_list,den_var_list);
-
- tay_expsn := taylor(g, y,0,n+d);
- tay_output := taylortostandard(tay_expsn);
- if NOT(freeof(tay_output,df)) then rederr "not yet implemented"
- %Some Taylor Expansions do not exist at present.
- else
- << poly_taylor :=
- denom*(num tay_output) - numer*(den tay_output);
- coeff_list := COEFF(poly_taylor,y);
- if (n+d+1)>length(coeff_list)
- %Only consider first n+d+1 coefficients at most.
- then new_list := coeff_list
- else new_list :=
- for kk:= 1:n+d+1 collect part(coeff_list,kk);
-
- part_answer := solve(new_list,variable_list);
- count :=0;
- zero_check_list :=
- for each r in
- (for each q in
- (for p:=n+2:n+d+2 collect part(first part_answer,p))
- collect part(q,2))
- do <<if r=0 then count:=count+1>>;
-
- %if all the coefficients of the denominator are zero
- if count=d+1
- then rederr "Pade Approximation of this order does not exist"
- else
- << answer:= sub(part_answer, numer/denom);
- %if Pade would be returned as a Taylor expansion
- if taylorp answer
- then rederr "no Pade Approximation exists"
- %following commented out as not sure it is necessary
- % else
- % << if length answer=0
- % then
- % rederr "Pade Approximation of this order does not exist"
- else return sub(y=x,answer)
- % >>;
- >>;
- >>;
- >>;
- end;
- endmodule;
- end;
|