2017-07-18 1 views
0

大きなスクリプトでfsolveを使用しています。 fsolveNo solution foundを返します。私は特定の制限を守るforループの行列の行を見つけようとしています。これは以前の行optimoptions('fsolve', 'Algorithm', 'levenberg-marquardt')のために私を助けてくれました。今、私は他の選択肢が意味を成しているか分からないために立ち往生しています。私はそれらを理解することなく、別のオプションを試して運がなかった。 fsolveどのオプションを試してみませんか?

この

No solution found

options1 = optimoptions('fsolve', 'Algorithm', 'levenberg-marquardt'); 
[gamma_k_1y, fval, exitflag, ~] = fsolve(@(gamma_k_1y) f_gamma(gamma_k_1y, m, bstar(k), Lstar, min(y,m)), zeros(min(y,m),1), options1); 

は、これは私が解決したい機能です返すコードです

function F = f_gamma(gamma_1y, m, bstar_k, Lstar, y) 
%UNTITLED3 Summary of this function goes here 
% Detailed explanation goes here 
F(1) = sum(gamma_1y); % row sum zero 
F(2) = sum(gamma_1y.^2) - m; % elements squared = m 
F(3) = sum((Lstar(1,1:y).^2) * gamma_1y) - m * bstar_k; % first row squared times new row = m times element od bstar 
n_assigned_rows = sum(~isnan(Lstar(:,1))); 
for i=1:n_assigned_rows 
    F(i+3) = Lstar(i,1:y) * gamma_1y; %element wise multiplication with each row except self zero 
end 

end 

これらは私の変数です

% ------------------------------------------------------------------- 
% Generated by MATLAB on 18-Jul-2017 11:17:31 
% MATLAB version: 9.2.0.538062 (R2017a) 
% ------------------------------------------------------------------- 

Lstar = ... 
    [1.9193221763392923 -1.8182365289779376 -0.10108564736135461 0 0 0 0; 
    -0.054995957568300745 0.045658192660796168 -1.8654711092538141 1.8748088741613205 ... 
    0 0 0; 
    -0.045613771137015049 0.011357535373129623 -1.0703617279866948 -1.0666452698891478 ... 
    2.1712632336401225 0 0; 
    -0.010566489657722691 -0.0548196464049537 0.78541897633795066 0.78253217221128113 ... 
    0.77167395707940156 -2.2742389695659573 0; 
    -0.024717877486905307 -0.059891167589263682 0.60794721966412446 0.60565273026541278 ... 
    0.59702240468188983 0.62248826258542045 -2.348501572120679; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN; 
    NaN NaN NaN NaN NaN NaN NaN]; 

alpha = [1.9193221763392923 -1.8182365289779376 -0.10108564736135461 0 ... 
     0 0 0]; 

b = [1; 1; 1; 1; 2; 1; 1]; 

beta = [-0.054995957568300745 0.045658192660796168 -1.8654711092538141 ... 
     1.8748088741613205 0 0 0]; 

beta_14 = [-0.054995957568300745; 0.045658192660796168; -1.8654711092538141; ... 
      1.8748088741613205]; 

bstar = [0.15118578920369091; -0.010101525445522112; -0.020203050891044225; ... 
     -0.030304576336566323; -0.040406101782088436; 0.020203050891044225; ... 
     0.010101525445522112]; 

exitflag = -2; 

fval = [-4.2566077443698074 -2.221444134718805 1.5553705289078517 -0.64353855088729561 ... 
     0.042998187795194528 0.085996469204826287 0.12899460131301721 0.17199288121327205 ... 
     ]; 

gamma_k_1y = [0.050858405964284731; 0.45946005395777284; -0.93242551108612626; ... 
       -0.91454430220858973; -0.8706585765149597; -1.0001539165810418; ... 
       -1.0491438979011476]; 

gamma_k_ym = saveVarsMat.gamma_k_ym; % <1x0 double> empty object 

j = 7; 

k = 6; 

m = 7; 

n = 20; 

omega = ... 
    [0.3779644730092272 0.70710678118654746 0 0 0 0 0; 
    0.3779644730092272 -0.70710678118654746 0.70710678118654746 0 0 0 0; 
    0.3779644730092272 0 -0.70710678118654746 0.70710678118654746 0 0 0; 
    0.3779644730092272 0 0 -0.70710678118654746 0.70710678118654746 0 0; 
    0.3779644730092272 0 0 0 -0.70710678118654746 0.70710678118654746 0; 
    0.3779644730092272 0 0 0 0 -0.70710678118654746 0.70710678118654746; 
    0.3779644730092272 0 0 0 0 0 -0.70710678118654746]; 



x = 1.9193221763392923; 

y = 8; 

z = -0.10108564736135461; 

Rはnleqslevでこれを解決できるので、オプションallowSingular=TRUEを指定して解決策があることは知っています。

答えて

0

多分それは何もありませんが、別の初期点を試しましたか?ここで、x0 = 0(min(y、m)、1)を設定していることがわかります。この時点で開始する理由はありますか?私は尋ねているだけです。

ループ内でx0 = unifrnd(a、b)(あなたがaとbを選択した)を試してみるかもしれないので、各繰り返しで異なる点から始まる "fsolve"を試みます。

希望すると助かります

関連する問題