楼主: Samuelson
7393 3

[学术资料] matlab中关于fsolve解非线性方程组的问题 [推广有奖]

  • 0关注
  • 0粉丝

小学生

42%

还不是VIP/贵宾

-

威望
0
论坛币
353 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
43 点
帖子
3
精华
0
在线时间
7 小时
注册时间
2005-9-23
最后登录
2015-7-12

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
求E1_mean的程序没问题,function定义也没问题,问题出在fsolve。fsolve是为了求每个E1_mean元素对应的x(1),x(2),也就是V和sigmaV,E1_mean包含10000个数据,怎样才能一次性求出对应的10000对V和sigmaV?   matlab为R2013b。程序如下:
global E1_mean
beta01=zeros(1,10000);beta01(1,: )=0.00000901;beta1=0.93095390;beta2=0.06165110;r=zeros(1,10000);r(1,: )=0.00196230; theta=zeros(1,10000);theta(1,: )=-0.00032120 ;path1=zeros(245,10000);    path1(1,: )=0.001218392 ^2;R1=zeros(245,10000);
for i=2:245
    path1(i,: )=beta01+beta1*path1(i-1,: )+beta2*path1(i-1,: ).*(randn(1,10000)-theta).^2 ;  
    R1(i,: )=r+(path1(i,: ).^0.5).*randn(1,10000);     
end
R1_cumsum=cumsum(R1,1);
E1=zeros(244,10000);
for i=1:244
    E1(i,: )=180970333.4*exp(R1_cumsum(i+1,: ));
end
E1_mean=mean(E1,1);

function F = blsprice(x)
global E1_mean j
%   x(1) : V; 银行总资产
%   x(2) : sigmav; 资产波动率
rf = 3.6/100;      %无风险利率
B = 2055510000000.00 /(10^12) ;      %股权的执行价格 B/(10^12)
sigmaE = 0.545240875  ;        
T = 1;     % 时间周期
t = 0;     % 时间
for j=1:10000
d1 = (log(x(1)/(0.97*B))+rf*(T-t)+x(2)^2*(T-t)/2) / (x(2)*sqrt(T-t));
d2 = d1-x(2)*sqrt(T-t);
F(1) = x(1)* normcdf(d1) - 0.97*B* normcdf(d2) -(E1_mean(1,j))/10^12;   
F(2) = x(1)*normcdf(d1)*x(2) - sigmaE*(E1_mean(1,j))/10^12;
end

global  j
V1=zeros(1,10000);
sigmaV1=zeros(1,10000);
for j=1:10000
x0 = [1.2;1];  
options=optimset('Display','off','MaxFunEvals',10000,'MaxIter',10000);
[x,fval] = fsolve(@blsprice,x0,options);
V1(1,j)=x(1);
sigmaV1(1,j)=x(2);
end

程序运行后显示Error using erfc

Input must be real and full.

Error in normcdf>localnormcdf (line 124)

p(todo) = 0.5 * erfc(-z ./ sqrt(2));

Error in normcdf (line 46)

[varargout{1:max(1,nargout)}] =localnormcdf(uflag,x,varargin{:});

Error in blsprice (line 20)

F(1) = x(1)* normcdf(d1) - 0.97*B*normcdf(d2) -(E1_mean(1,j))/10^12;   

Error in trustnleqn (line 200)

    F= feval(funfcn{3},reshape(xTrial,sizes.xRows,sizes.xCols),varargin{:});

Error in fsolve (line 366)

   [x,FVAL,JACOB,EXITFLAG,OUTPUT,msgData]=...

Error in solve_blsprice (line 9)

[x,fval] = fsolve(@blsprice,x0,options);


二维码

扫码加我 拉你入群

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

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

关键词:非线性方程组 MATLAB fsolve matla 线性方程组 matlab 方程组

回帖推荐

Chemist_MZ 发表于2楼  查看完整内容

d1 = 0.3927 + 2.0360i d2 = -1.1503 + 2.0360i Error using erfc Input must be real and full. ... out put d1 d2你就会发现 solve在寻找解得过程中迭代到了复数,因此normcdf出了错,error msg里面最上层才是出问题的函数,而不是最下面。检查你的code,我看你j=1的时候就找了半天,说明你的目标函数的形状很差,solver收敛不了,所以找了好久解最后找到了复数。复数可能是log取负数的时候出现的, ...

本帖被以下文库推荐

沙发
Chemist_MZ 在职认证  发表于 2015-5-9 10:16:13 |只看作者 |坛友微信交流群
d1 =

   0.3927 + 2.0360i


d2 =

  -1.1503 + 2.0360i

Error using erfc
Input must be real and full.

...

out put d1 d2你就会发现   solve在寻找解得过程中迭代到了复数,因此normcdf出了错,error msg里面最上层才是出问题的函数,而不是最下面。检查你的code,我看你j=1的时候就找了半天,说明你的目标函数的形状很差,solver收敛不了,所以找了好久解最后找到了复数。复数可能是log取负数的时候出现的,因为solver不知道x的定义域,他在寻找解得过程中用负数去试显然会出问题。我觉得应该是你的code有地方有bug,否则肯定一下子就能找到。



已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
见路不走 + 10 + 10 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 10  论坛币 + 10  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

藤椅
Samuelson 发表于 2015-5-9 20:03:38 |只看作者 |坛友微信交流群
Chemist_MZ 发表于 2015-5-9 10:16
d1 =

   0.3927 + 2.0360i
多谢大神!!!能不能提一些改进建议?

使用道具

板凳
霉菌- 发表于 2023-3-3 09:30:31 |只看作者 |坛友微信交流群
请问楼主解决了吗?

使用道具

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

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

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

GMT+8, 2024-4-27 09:29