Clear Filters
Clear Filters

fsolve with independent functions

1 view (last 30 days)
Hello, guys.
I've got some questions about 'fsolve'. The situation is following.
There is function handle matrix and its element function is independent each other. The reason why I put the functions into elements in the matrix is only I want to avoid very slow for-loop. In addition... Due to different output according to different x0, I duplicated function handle and made x0 matrix of different values for investigating multiple solutions.
In short, I used fsolve on the matrix of the independent functions.
The problem is that fsolve judges the state on results (w.r.t exitflag) integrally. 'Equation solved' message was displayed if every single (not partial) element equation was solved. So exitflag is always a single value, not a matrix. To make matters worse, there is no case of exitflag=-3 in R2012a.
I think there might be no solution in some elements as specfic x0 elements. In the case, I would only ignore them. (I don't wanna obsess that.) Could I get the results with exitflag matrix of independent elements?
eplasmafre=[4.7176e+12 4.2953e+12 3.5814e+12;2.5148e+12 1.7696e+10 5.2964e+12];
vthe=[1.6477e+06 1.6477e+06 1.6477e+06;1.6477e+06 1.6477e+06 1.6477e+06];
[meshx,meshy]=size(eplasmafre);LightVel=3e8;RFangFrequency=2*pi*13.56*1e6;
ScanDetail=[1 4 7];ScanDetailNum=length(ScanDetail);
ScanOrder=3:9;ScanOrderNum=length(ScanOrder);
ScansetNum=ScanDetailNum.*ScanOrderNum;Scanset=(reshape((ScanDetail'*(10.^(ScanOrder))),1,ScansetNum))';
eplasmafreScan=repmat(eplasmafre,[ScansetNum,1]);vtheScan=repmat(vthe,[ScansetNum,1]);
ScansetScan=sort(repmat(Scanset,meshx,meshy));
FtnforStocFre=@(Xfre)(1e8.*((4.*((LightVel./eplasmafreScan).*sqrt(2.*(1+((Xfre.^2)./(RFangFrequency.^2)))./(1+sqrt(1+((Xfre.^2)./(RFangFrequency.^2))))))./vtheScan).*((1./pi).*((exp(4.*(((LightVel./eplasmafreScan).*sqrt(2.*(1+((Xfre.^2)./(RFangFrequency.^2)))./(1+sqrt(1+((Xfre.^2)./(RFangFrequency.^2)))))).^2).*(RFangFrequency.^2)./(pi.*(vtheScan.^2))).*(1+(4.*(((LightVel./eplasmafreScan).*sqrt(2.*(1+((Xfre.^2)./(RFangFrequency.^2)))./(1+sqrt(1+((Xfre.^2)./(RFangFrequency.^2)))))).^2).*(RFangFrequency.^2)./(pi.*(vtheScan.^2)))).*expint((4.*(((LightVel./eplasmafreScan).*sqrt(2.*(1+((Xfre.^2)./(RFangFrequency.^2)))./(1+sqrt(1+((Xfre.^2)./(RFangFrequency.^2)))))).^2).*(RFangFrequency.^2)./(pi.*(vtheScan.^2)))))-1))-Xfre./((Xfre.^2)+(RFangFrequency.^2))));
options=optimset('Display','iter','TolFun',1e-20,'PlotFcns',@optimplotfval);
[solmat,~,exitflag,output]=fsolve(FtnforStocFre,ScansetScan,options);
  1 Comment
Walter Roberson
Walter Roberson on 18 Jun 2012
Please consider adding some blank lines in the code, as everything just runs together.

Sign in to comment.

Accepted Answer

Alan Weiss
Alan Weiss on 18 Jun 2012
I believe that your best course of action is to do the loop, one-dimensional problems. When fsolve addresses an N-dimensional problem, internally it estimates an approximate Hessian N-by-N matrix (well, it might not really do an N^2 matrix, but it does look at a larger problem). You can help it by giving it a Jacobian sparsity pattern.
But because you believe some of your 1-D problems are not soluble, and you want to know which ones, bite the bullet and just do the loop. You might be surprised how well it works.
Also, do not give a TolFun (or other tolerance) of less than eps ~ 2e-16. I would not give a tolerance of less than 1e-14 without a very good reason.
Alan Weiss
MATLAB mathematical toolbox documentation
  2 Comments
Sung-Ryul Huh
Sung-Ryul Huh on 20 Jun 2012
Thx for your advice. I surprised how well it works except the initial value problem.
Some functions as elements of my object function were NANs to given initial value x0.
I checked that they are always NANs to any initial x0 due to mathematical reason (or physical reason).
I wanna keep going fsolve solver with ignoring stop error message on NANs and put zeros into ruddy elements after the calculation. Please show me how. (disappearance of exitflag=-3 in R2012a is the disaster for me.)
Alan Weiss
Alan Weiss on 20 Jun 2012
I am not sure that I understand you. You cannot solve anything when you have a NaN in your initial value. The FunValCheck option exists to warn you about the existence of NaN in your iterations. Once a NaN creeps into your calculation, Optimization Toolbox solvers cannot proceed.
In your loop you can check if any NaN appear in an initial value, and skip those points.
But I feel I did not address your problem correctly. Please ask again if I missed the point.
Alan Weiss
MATLAB mathematical toolbox documentation

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!