Clear Filters
Clear Filters

What's the formula used for kummerU?

4 views (last 30 days)
Hi! Thanks for reading!
I need to write a kummer U function for myself.
For kummerU funtion, it is said in the doc that:
But it's only for Re(a)>0 and Re(z)>0, while I want the formula for a<0. So I try to read its source code:
function y = kummerU(a,b,x)
%KUMMERU Kummer's confluent hypergeometric U function.
% U = kummerU(a,b,x) computes the value of Kummer's U function
% U = 1/gamma(a) * int(exp(-x*t)*t^(a-1)*(1+t)^(b-a-1),t,0,inf).
%
% Reference:
% [1] Abramowitz, Milton; Stegun, Irene A., eds., "Chapter 13",
% Handbook of Mathematical Functions with Formulas, Graphs, and
% Mathematical Tables, New York: Dover, pp. 504, 1965.
% Copyright 2014 The MathWorks, Inc.
y = sym.useSymForNumeric(@kummerU, a, b, x);
end
There is nothing for me. So does the function
sym.useSymForNumeric(@kummerU, a, b, x)
There is no str "kummerU" inside it.
So how can I find out how matlab realize kummerU with negative a?
Or it would be better if you know the formula for negative a.
Any suggestion is appreciated!
  2 Comments
Walter Roberson
Walter Roberson on 15 Apr 2023
However there are special cases for negative integer a, in which case the formula becomes a polynomial

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 15 Apr 2023
Execute
regexprep(char(evalin(symengine, 'expose(kummerU)')) , '\\n', '\n')
to be shown the formula used.
  2 Comments
祥宇 崔
祥宇 崔 on 16 Apr 2023
Sometimes it's just hard to find the function we want. There are too many in matlab.
Thanks, experienced Roberson!
This is exactly what I want!!!!
祥宇 崔
祥宇 崔 on 16 Apr 2023
Edited: 祥宇 崔 on 16 Apr 2023
It seems that kummerU uses laguerre polynomial:
if domtype(ra) = DOM_INT && 0 <= ra && iszero(frac(a)) && ra < Pref::autoExpansionLimit() then
return((-1)^ra*ra!*laguerreL(ra, b - 1, z))
end_if;
Then, for laguerreL:
if domtype(n) = DOM_INT && 0 <= n then
return(orthpoly::laguerre(n, a, x))
end_if;
For the function:
orthpoly::laguerre(n, a, x)
I look through the code roughly:
proc(n, a, x)
name orthpoly::laguerre;
local i, expand_coeffs, r0, r1;
begin
if args(0) <> 3 then
error(message(\"symbolic:orthpoly:IncorrectNumberOfArguments\"))
end_if;
if contains({n, x}, undefined) then
return(undefined)
end_if;
if contains({n, x}, RD_NAN) then
return(RD_NAN)
end_if;
n := specfunc::makeInteger(n);
if n = FAIL || type(n) = DOM_INT && n < 0 || n = -infinity then
error(message(\"symbolic:specfunc:ExpectingNonNegativeIntegerOrSymbol\"))
end_if;
if type(n) = stdlib::Infinity then
return(undefined)
end_if;
if ~domtype(n) = DOM_INT then
return(procname(args()))
end_if;
if ~testtype(a, Type::Arithmetical) then
error(message(\"symbolic:orthpoly:InvalidSecondArgument\"))
end_if;
if contains({DOM_RAT, DOM_INT, DOM_FLOAT, DOM_COMPLEX}, domtype(a)) && contains({DOM_RAT, DOM_INT, DOM_FLOAT, DOM_COMPLEX}, domtype(x)) then
expand_coeffs := FALSE
else
expand_coeffs := TRUE
end_if;
if ~testtype(x, Type::Arithmetical) then
error(message(\"symbolic:orthpoly:InvalidThirdArgument\"))
end_if;
if iszero(n + a) then
develinfo(1, \"using special formula\");
return(((-1)^n/n!)*x^n)
end_if;
if domtype(x) = DOM_IDENT || type(x) = \"_index\" then
case n
of 0 do
return(1)
of 1 do
return(1 + a - x)
otherwise
r0 := poly(1, [x]);
r1 := poly(1 + a - x, [x]);
assert(expand_coeffs);
for i from 1 to n - 1 do
[r1, r0] := [mapcoeffs(poly((2*i + 1 + a - x)/(i + 1), [x])*r1 - poly((i + a)/(i + 1), [x])*r0, expand), r1]
end_for;
return(op(r1, 1))
end_case
else
case n
of 0 do
return(1)
of 1 do
return(1 + a - x)
otherwise
r0 := 1;
r1 := expand(1 + a - x);
if expand_coeffs then
for i from 1 to n - 1 do
[r1, r0] := [expand(((2*i + 1 + a - x)*r1 - (i + a)*r0)/(i + 1)), r1]
end_for
else
for i from 1 to n - 1 do
[r1, r0] := [((2*i + 1 + a - x)*r1 - (i + a)*r0)/(i + 1), r1]
end_for
end_if;
return(r1)
end_case
end_if
end_proc'
I think it's based on polynomial summation.
So in conclusion, I think for my question:
Matlab use polynomials instead of integration to realize kummerU function. It makes sense since it's usually easier to calculate polynomial than numerical integration.

Sign in to comment.

More Answers (0)

Products


Release

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!