필터 지우기
필터 지우기

polyval error with recurrence relation

조회 수: 2 (최근 30일)
T
T 2013년 10월 6일
댓글: T 2013년 10월 11일
function c = relation( n )
if n==0
c = 1;
elseif n==1
syms x
c = [x 0];
else
syms x
c = ((2*n-1)*x*[relation(n-1),0] - (n-1)*[0,0,relation(n-2)])/n;
sum(c)
end
n=8
m=n+1;
xval=linspace(-1,1,5000)
I=trapsum(polyval(relation(n),xval).*polyval(relation(m),xval),-1,1);
Gives the following output:
??? Error using ==> polyval
Inputs to polyval must be floats, namely single or double.
Error in ==> polyval at 63
y = zeros(siz_x, superiorfloat(x,p));
What needs to be done to ensure that the output for the recurrence relation is a double?
I mean, in the function, we have syms x but this is to acquire the polynomial in analytic form. It's not necessary in this case but I need to plot it later on. The main issue I have is evaluating the integral using trapsum but I would need to do both; plot for various n, evaluate the integral.

채택된 답변

Walter Roberson
Walter Roberson 2013년 10월 6일
In your code for relation(), why do you have
sum(c)
which is just displaying the sum rather than returning the sum ?
After you build the relation symbolically, use
RelationM = relation(m);
RelationN = relation(n);
funM = matlabFunction(RelationM);
funN = matlabFunction(RelationN);
Y = funM(xval) .* funN(xval);
trapsum(Y, -1, 1)
However, I do not know what your trapsum routine does: it is not a routine in any Mathworks toolbox, and the obvious trapsum in the File Exchange uses a different calling sequence.
  댓글 수: 14
T
T 2013년 10월 8일
That's right. And for some reason using c1 and c2 will not generate the same polynomials for n where if you used
c = ((2*n-1)*x*[relation(n-1),0] - (n-1)*[0,0,relation(n-2)])/n;
The point was to do this using recursive programming.
T
T 2013년 10월 11일
편집: T 2013년 10월 11일
Actually I don't think I need to do any of the above:
for n=0:inf
m=n+1;
int( ((2*n-1)*x*[relation(n-1),0] - (n-1)*[0,0,relation(n-2)])/n )* ((2*m-1)*x*[relation(m-1),0] - (m-1)*[0,0,relation(m-2)])/m),x,-1,1)
end
This will just give me zero. But is it possible to determine the round-off error? Or at least get the maximum value of n before the loop crashes?
I can set the recursion limit using:
set(0, 'RecursionLimit', 100000) but it keeps crashing still.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Matt J
Matt J 2013년 10월 6일
편집: Matt J 2013년 10월 6일
Get rid of the "syms x". You are doing only numerical manipulations with the polynomial so there is no apparent need to have it in symbolic form, and that includes for plotting. Example
t=linspace(-1,1,1000);
p=[1 2 1]; %polynomial coefficients
plot(t,polyval(p,t))
Also, why use trapsum instead of the builtin trapz?
  댓글 수: 3
Matt J
Matt J 2013년 10월 6일
It's the function relation() that can't be found. Check your path.
T
T 2013년 10월 6일
Okay now I receive the error:
??? Undefined function or variable 'x'.
Error in ==> rlegendre at 9
c = ((2*n-1)*x*[rlegendre(n-1),0] - (n-1)*[0,0,rlegendre(n-2)])/n;
This happens when I remove syms x.

댓글을 달려면 로그인하십시오.

태그

Community Treasure Hunt

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

Start Hunting!

Translated by