How To Fix an Infinite Recursion?
古いコメントを表示
I keep getting the following error when I run this code: "Out of memory. The likely cause is an infinite recursion within the program." It refers to this part of the code: "Error in AmericanPrice (line 4) P=AmericanPrice(0.08,0.12,0.2,100,50,10,300,3);" How can I fix this?
Update1: My bad, there was some typos in the code, it should be updated now! After entering the input arguments , i get this error "Undefined function 'find' for input arguments of type 'cell'. Error in AmericanPrice (line 32) bn=find(sign(diff(Pn)/dx+1)-1,1,{'last'})+bn;"
Update2: After changing "bn=find(sign(diff(Pn)/dx+1)-1,1,{'last'})+bn;" to "bn=find(sign(diff(Pn)/dx+1)-1,1,['last'])+bn;" i was able to get an output , im checking atm if it is the appropriate output
function [P,b]=AmericanPrice(r,delta,sigma,K,nx,nt,Xhat,That)
%Usage:P=AmericanPrice(r,delta,sigma,K,nx,nt,Xhat,That)
%Example:P=AmericanPrice(0.08,0.12,0.2,100,50,10,300,3);
dx=Xhat/nx;
dt=That/nt;
for i=1:nx-1
A(i,i:i+2)=[((r-delta)*dt*i-sigma^2*dt*i^2)/2...
1+r*dt+sigma^2*dt*i^2
(-(r-delta)*dt*i-sigma^2*dt*i^2)/2];
end
P(:,1)=max(K-[0:dx:Xhat],0);
if(delta==0)
b(1)=K;
else
b(1)=min(K,K*r/delta);
end
for j=2:nt+1
bn=0; run=1;
while(run)
An=[A(1+bn:end,1+bn:end)];
An(end+1,end-1:end)=[-1 1];
An(end+1,1)=1;
Cn=[P(bn+2:nx,j-1)' 0 K-bn*dx]';
Pn=inv(An)*Cn;
if(Pn(2)<K-((bn+1)*dx))
bn=find(sign(diff(Pn)/dx+1)-1,1,{'last'})+bn;
else
b(j)=bn*dx; run=0;
end
end
P(:,j)=[K-[0:bn-1]*dx Pn'];
end
採用された回答
その他の回答 (2 件)
John D'Errico
2017 年 4 月 3 日
編集済み: John D'Errico
2017 年 4 月 3 日
Is AmericanPrice the name of this function? If so, then it calls itself. Note the error message is:
"Error in AmericanPrice (line 4)
P=AmericanPrice(0.08,0.12,0.2,100,50,10,300,3);"
So, line 4 of the AmericanPrice function is a call to AmericanPrice. That will go on forever, therefore the infinite recursion.
2 件のコメント
Star Strider
2017 年 4 月 3 日
I considered that.
I opted to explore the hypothesis that ‘run’ isn’t changing first, since we don’t know if the function is calling itself.
K
2017 年 4 月 3 日
Star Strider
2017 年 4 月 2 日
By your description, ‘run’ never changes. Since it appears that ‘bn’ is always going to be positive and increasing, one way to keep your while loop from becoming infinite (until you can determine what the problem is) would be to change the while condition to include a limit on ‘bn’:
while(run | (bn < 1E+3))
Remember not to use the ‘short circuit’ operator or the ‘bn’ test will never execute.
Note — This is UNTESTED CODE. You will have to test it.
5 件のコメント
K
2017 年 4 月 2 日
Star Strider
2017 年 4 月 2 日
No.
I’m not sure what you’re doing, how your code is supposed to work, or what you’re calculating. All I did was to include a ‘fail-safe’ so you can figure out what the problem is. When the ‘fail-safe’ stops your code, you’ll have access to the values of all your variables, so you can see what they are.
You’re the only one who actually can troubleshoot your code and see what isn’t working correctly.
If you can’t figure it out otherwise, use the debugger to understand what your code is doing and what your variable values are between iterations.
Star Strider
2017 年 4 月 3 日
Put a lower threshold on ‘bn’ and see what the result is:
while(run | (bn < 1E+1))
Either ‘run’ isn’t being toggled, or we’re only seeing part of your code, and as John mentioned, your function is calling itself.
Star Strider
2017 年 4 月 3 日
Definitely a typo here:
bn=find(sign(diff(Pn)/dx+1)-1,1,{'last'})+bn;
↑ ← DON’T USE A CELL STRUCTURE HERE
Try this instead:
bn = find(sign(diff(Pn)/dx+1)-1,1,'last')+bn;
カテゴリ
ヘルプ センター および File Exchange で Construct and Work with Object Arrays についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!