Python fsolve高度依赖于初始值(超过matlab)

时间:2016-04-21 14:03:30

标签: python matlab

我是python的新手,从Matlab过渡。我写了下面的代码来解决一个非线性方程系统,但在python中以某种方式失败了。它在matlab fsolve中用于许多初始值,除非我输入一个非常大的数字。但它只适用于python fsolve,如果初始值足够接近解决方案。我并不总是对这个问题有很好的初步猜测,所以我希望它能在大部分时间内完成。非常感谢你!根据Matlab,解决方案是[0.003,0.0053]。

Python代码

     param = {'r': 0.04, 
     'mu': 0.112,
     'delta': 0.02,
     'alpha': 0.35,
     'g': 0.0187 + 0.5*0.16*0.16,
     'sigma': 0.20,
     'xi0': 0.02,
     'xi1':1.05,
     'lambda0':0.02,
     'lambda1':1.05};

     param['sgsq'] = 0.5*param['sigma']**2;
     param['g0'] = param['g'] - (param['mu'] - param['r']) - param['sgsq'];

    #%% Polynomial
    import numpy as np
    import numpy.polynomial.polynomial as poly
    import scipy.optimize as spyopt

    param['coef'] = (- (param['r']+param['delta']), (param['g0']+param['delta']
                -param['sgsq']), param['sgsq'])

    charfun = poly.Polynomial(param['coef'])
    param['psi'] = np.max(poly.polyroots(param['coef']))
    param['halpha'] = poly.polyval(param['alpha'],param['coef'])

    def lumpyfun(x0, param0):    
xstar,B = x0
AIPx = - np.power(xstar,param0['alpha']) / param0['halpha']
BigA = ((1.0-param0['alpha'])*(B**param0['alpha'])/(1.0-param0['psi'])/param0['halpha'] 
        + (param0['lambda1']-param0['lambda0'])/(1.0-param0['psi']))
vprimex = param0['alpha']*AIPx/xstar + param0['psi']*np.power((xstar/B),(param0['psi']-1.0)) * BigA/B
vprimeB = (param0['psi']-param0['alpha'])*np.power(B,param0['alpha']-1.0)/(1.0-param0['psi'])/param0['halpha'] + param0['psi']*(param0['lambda1']-param0['lambda0'])/(1.0-param0['psi'])/B   
diffy = (AIPx + np.power(xstar/B,param0['psi']) * BigA - xstar*vprimex - param0['lambda1'], vprimex - vprimeB)
return diffy`def lumpyfun(x0, param0):

    #%% Solve the problem
    #worked      
    x0 = np.multiply(np.sqrt(-param['halpha']),(1.0,2.0))/100.0
    #lumpyfun(x0,param)
    spyopt.fsolve(lumpyfun, x0, args=param)

    # not worked      
    x0 = np.multiply(np.sqrt(-param['halpha']),(1.0,2.0))/10.0
    spyopt.fsolve(lumpyfun, x0, args=param, maxfev = 5000000)

Matlab代码:

    r = 0.04;
    mu = 0.112;
    delta = 0.02;
    alpha = 0.35;
    g = 0.0187 + 0.5*0.16*0.16 ; % 0.0187 + 0.5*sigma*sigma;

    sigma = 0.20; % 0.16 default;
    a2 = 0.5*sigma*sigma;
    g0 = g - (mu-r) - a2; % risk-neutral growth;

    lambda0 = 0.02;
    lambda1 = 1.05;

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %h = @(x) sgsq05*x^2 + (mu+delta-sgsq05)*x - (r+delta);
    coef = [a2, (g0+delta-a2), - (r+delta)];
    halpha = polyval(coef,alpha);
    phi = max(roots(coef))

    x0 = realsqrt(-halpha)*[1;2]/10;

    options = optimoptions('fsolve','Display','off','MaxFunEvals',2000);
    sol = fsolve(@(x)   diffinvestmentoption(x,phi,alpha,lambda1,lambda0,halpha), x0, options);


    function [diffy,X] = diffinvestmentoption(xin,phi,alpha,lambda1,lambda0,halpha)

    xstar = xin(1);
    B = xin(2);

    AIPx = -xstar.^alpha / halpha;
    %AIPB = -B.^alpha / halpha;
    BigA = (1-alpha)*(B^alpha)/(1-phi)/halpha + (lambda1-lambda0)/(1-phi);
    vprimex = alpha*AIPx/xstar + phi*(xstar/B)^(phi-1) * BigA/B;
    vprimeB = (phi-alpha)*(B^(alpha-1))/(1-phi)/halpha + phi*(lambda1-lambda0)/(1-phi)/B;

    diffy = [AIPx + (xstar/B)^phi * BigA - xstar*vprimex - lambda1;
            vprimex - vprimeB];

0 个答案:

没有答案