我是想解这样一个方程
F已知,我将它对x和y求了微分,利用两次quadgk来求积分(吴鹏书里给出的方法)
r是一个给定的量,假设为0.05.
我编写了下面的程序:
x0=[0.5;0.5];
p= fsolve(@(x,y) functionab(x,y), x0);
上面是我的调用语句,functionab里面放的是上面的这个积分方程。
我运行的时候,matlab会报错:
??? Input argument "y" is undefined.
Error in ==> @(x,y)functionab(x,y)
Error in ==> fsolve at 254
fuser = feval(funfcn{3},x,varargin{:});
Error in ==> SolveAb at 5
p= fsolve(@(x,y) functionab(x,y), x0);
Caused by:
Failure in initial user-supplied objective function evaluation. FSOLVE cannot continue.
我想知道为什么会这样啊?书里面例子的写法跟我差不多啊,为什么说我没有定义变量呢?
下面是相关的其它函数:
下面是方程组的函数,嵌套了copula和边缘分布cdf的函数,我贴出来:
%functionab.m
function [ f ] = functionab(x,y)
%引理3.1方程组函数,目的是解出最优的持有量a,b. r是要给定的参数。
r=0.05;
f(1)=quadgk(@(u) arrayfun(@(uu) quadgk(@(v) arrayfun(@(vv) (r-vv)./(1+r+x.*(vv-r)+y.*(uu-r)).*GumblePdf(vv,uu).*...
NasdaqPdf(vv).*Sp500Pdf(uu),v), -inf,inf),u), -Inf, Inf);
f(2)=quadgk(@(u) arrayfun(@(uu) quadgk(@(v) arrayfun(@(vv) (r-uu)./(1+r+x.*(vv-r)+y.*(uu-r)).*GumblePdf(vv,uu).*...
NasdaqPdf(vv).*Sp500Pdf(uu),v), -Inf,Inf),u), -Inf, Inf);
f=[f(1);f(2)];
后面是嵌套函数,可以不用去管
%nasdaqCdf
function [ y ] = NasdaqCdf( x )
%NASDAQCDF Summary of this function goes here
% Detailed explanation goes here
y=quadgk(@(u) NasdaqPdf(u),-inf,x);
end
%sp500Cdf
function [ y ] = Sp500Cdf( x )
%SP500CDF Summary of this function goes here
% Detailed explanation goes here
y=quadgk(@(u) Sp500Pdf(u),-inf,x);
end
%Gumble Copula function
function [ f ] = GumbleCopulaFunction( x , y )
%GUMBLECOPULAFUNCTION Summary of this function goes here
% Detailed explanation goes here
a=3.6443;
%f=exp(-((-log(NasdaqCdf(x))).^a+(-log(Sp500Cdf(y))).^a).^(1./a));
f=exp(log(NasdaqCdf(x)).*(1+(log(Sp500Cdf(y))./log(NasdaqCdf(x))).^a).^(1./a));
end
%Gumble copula Pdf
function [ f ] = GumblePdf( x,y )
%GUMBLEPARTIALDIFFERENCE Gumble copula函数的二阶联合偏导
a=3.6443;
v=NasdaqCdf(x);
z=Sp500Cdf(y);
f1=GumbleCopulaFunction(x,y);
f=f1./(v.*z).*(log(v).*log(z)).^(a-1).*...
(((-log(v)).^a+(-log(z)).^a).^(2./a-2)-(1-a).*((-log(v)).^a+(-log(z)).^a)...
.^(1/a-2));
end
end
最后是两个核密度生成pdf的函数,由于要加载数据,不能嵌套到上面的函数里。
%nasdaqPdf文件
function [ fnasdaq ] = NasdaqPdf( x )
%NASDAQPDF Summary of this function goes here
% Detailed explanation goes here
load nasdaq1261.txt
N=1261;
t=0;
for i=1:1261
t=t+exp(-0.5*((x-nasdaq1261(i))/0.0025).^2);
end
fnasdaq=1/(sqrt(2*pi)*N*0.0025)*t;
end
%sp500Pdf文件
function [ fsp500 ] = Sp500Pdf( x )
%SP500PDF Summary of this function goes here
% Detailed explanation goes here
load sp5001261.txt;
N=1261;
t=0;
for i=1:1261
t=t+exp(-0.5*((x-sp5001261(i))/0.0025).^2);
end
fsp500=1/(sqrt(2*pi)*N*0.0025)*t;
end