楼主: yjhanywhere
6793 1

[问答] 请教一个matlab关于函数调用的问题 [推广有奖]

  • 4关注
  • 4粉丝

副教授

17%

还不是VIP/贵宾

-

TA的文库  其他...

金工策略开发实用文章及书籍

威望
0
论坛币
904 个
通用积分
34.8724
学术水平
16 点
热心指数
16 点
信用等级
12 点
经验
156 点
帖子
439
精华
0
在线时间
989 小时
注册时间
2008-5-20
最后登录
2023-2-7

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我是想解这样一个方程

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

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:MATLAB matla atlab 函数调用 Lab matlab

沙发
epoh 发表于 2012-4-30 19:37:31 |只看作者 |坛友微信交流群

呵呵,似乎看错了

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 15:38