【发布时间】:2019-09-14 00:48:22
【问题描述】:
我正在尝试使用 fsolve 和 dogleg 方法求解两个非线性方程组。我的目标函数及其雅可比是这样的
function [F jacF]= objective(x)
F(:,1) = ((((x(:,2)./10).*k).*(x(:,1)./100)).^2).*(rZ - Rs) +(( Cmax .* ( x(:,1)./100 ) ).^2).*( w.^2.*(rZ - Rs) ) - (((x(:,2)./10).*k).*(x(:,1)./100));
F(:,2) = (x(:,2).*k).^2.*(iZ - w.*Ls) + (x(:,2).*k).^2.*x(:,1).*((w.*Ls)./200) + x(:,1).*((w.*Ls)/200).*(w.*Cmax).^2 + (w.*Cmax).^2 .*(iZ -(w.*Ls));
if nargout > 1 % need Jacobian
jacF = [- k - (k.^2.*x(:,2).*x(:,1).*(Rs - rZ))./50, - (k.^2.*x(:,2).^2.*(Rs - rZ))./100 - (Cmax.^2.*w.^2.*(Rs - rZ))./100;
2.*k.^2.*x(:,2).*(iZ - Ls.*w) + (k.^2.*Ls.*x(:,2).*w.*x(:,1))./100,(Ls.*Cmax.^2.*w.^3)./200 + (Ls.*k.^2.*x(:,2).^2.*w)./200];
end
end
那么我对 fsolve 的配置是这样的
options = optimoptions('fsolve','Display','iter-detailed','PlotFcn',@optimplotfirstorderopt);
% options.StepTolerance = 1e-13;
options.OptimalityTolerance = 1e-12;
options.FunctionTolerance = 6e-11;
options.MaxIterations = 100000;
options.MaxFunctionEvaluations = 400;%*400;
options.Algorithm = 'trust-region-dogleg';%'trust-region'%'levenberg-marquardt';%
% options.FiniteDifferenceType= 'central';
options.SpecifyObjectiveGradient = true;
fun= @objective;
x0 = [x1',x2'];
% Solve the function fun
[gwc,fval,exitflag,output,jacobianEval] =fsolve(fun,x0,options);
作为方程的值
Rs =
0.1640
Ls =
1.1000e-07
Cmax =
7.0000e-11
w =
1.7040e+08
rZ =
12.6518
iZ =
14.5273
K =
0.1007
x0 =
70.56 0.0759
我的问题来了,因为我不明白为什么 fsolve 似乎没有像我预期的那样迭代 x(:,1)。我确实知道上述系统和参数的解决方案应该是x1=58.8和x2=0.0775。
为了测试方法的收敛性,我设置为初始猜测x0 = [x1*(1+20/100) 0.0759] = [70.56 0.0759](x1 中的误差为 20%,x2 上的值更高),但是 fsolve 给出的解决方案是初始点,这是为什么呢?我在我的设置中做错了什么吗?
提前致谢
【问题讨论】:
-
您能否向我们提供您尝试求解的实际方程,而不仅仅是代码?检查代码错误会更容易。另外,变量的预期范围是多少?您可以尝试将它们标准化。我会用一个图来回答你的问题,试图向你展示你的功能存在的问题。
-
变量的范围是
0<=x(:,1)<=100和0<=x(:,2)<=13。我将用这个和方程式编辑帖子
标签: matlab