我想在MATLAB中用fsolve
求解一个方程式我正在尝试这样做:
function F = root2d(P);
lambda = 2*10^-4;
th = -40:-1:-106;
PL1 = 10471285.480509; % (mw)
p1 = 10;
p2 = 6 ;
p3 = 8 ;
al = 2.5;
T = 10.^(th./10);
r = (p1*PL1^(-1)./T).^(1/al);
R = (p2*PL1^(-1)./T).^(1/al);
syms P
c = (lambda.*pi.*(R.^2));
j = 1:3;
D = zeros(3,67);
for k = 1:numel(j)
F(1) = (prod(D(k,:)==exp(P(1).*c.*(log(P(1)).^k/factorial(k))))).*exp(-(lambda*P(1).*pi.*(r.^2)))-P;
end
fun = @root2d;
P0 = 0;
P = fsolve(fun,P0)
你有什么想法吗?
答案 0 :(得分:1)
此代码中存在一些问题。我会帮助你解决最棘手的问题。
使用rubberduck debugging识别。让我通过向您解释您的代码来举例说明。
从顶部开始,您定义了一个名为root2d
的函数,它返回一些对象F
,然后在此函数中定义了很多常量。通过定义这些辅助函数,您可以定义符号函数F
,我们之前看到的是函数的输出。继续使用此函数root2d
,您现在创建一个函数句柄fun
到root2d
,然后在最后一行中调用fsolve
来解决fun
。
你看到错误了吗?
fsolve
调用fun
,它是root2d
的函数句柄。因此fsolve
调用root2d
。运行root2d
MATLAB会遇到调用fsolve
的新root2d
。即root2d
将一遍又一遍地被推到堆栈中。
这可以通过从函数中取出最后三行,然后从另一个脚本或终端运行它们来解决。
这样做会导致新错误:
无法执行赋值,因为左侧的索引是 与右侧的尺寸不相容。
sym/privsubsasgn
中的错误(第1085行)
L_tilde2 = builtin('subsasgn',L_tilde,struct('type','()','subs',{varargin}),R_tilde);
sym/subsasgn
中的错误(第922行)
C = privsubsasgn(L,R,inds{:});
SO
中的错误(第18行)
F(1) = (prod(D(k,:)==exp(P(1).*c.*(log(P(1)).^k/factorial(k))))).*exp(-(lambda*P(1).*pi.*(r.^2)))-P;
fsolve
中的错误(第242行)
fuser = feval(funfcn{3},x,varargin{:});
引起:
初始目标函数评估失败。 FSOLVE不能 继续。
即。您必须确保正确编写目标函数F(1) =...
。