我想用fsolve
在Matlab中求解一个非线性方程组,但我也必须微分关于两个变量的函数。以下是步骤中的问题:
步骤1:我定义了非线性函数系统F
:
function F = root2d(x)
F(1) = (exp(-x(1)+2)/(1+exp(-x(1)+2)+exp(-x(2)+1)));
F(2) = (exp(-x(2)+1)/(1+exp(-x(1)+2)+exp(-x(2)+1)));
end
步骤2:我想找到F(1)
相对于x(1)
的导数和F(2)
相对于x(2)
的导数,使得:
function F = root2d(x)
F(1) = (exp(-x(1)+2)/(1+exp(-x(1)+2)+exp(-x(2)+1)));
F(2) = (exp(-x(2)+1)/(1+exp(-x(1)+2)+exp(-x(2)+1)));
f1_d=diff(F(1),x(1))
f1_d=diff(F(2),x(2))
end
步骤3:我希望我的函数是原始函数加上导数:
function F = root2d(x)
F(1) = (exp(-x(1)+2)/(1+exp(-x(1)+2)+exp(-x(2)+1)));
F(2) = (exp(-x(2)+1)/(1+exp(-x(1)+2)+exp(-x(2)+1)));
f1_d=diff(F(1),x(1));
f1_d=diff(F(2),x(2));
F(1)=F(1)+f1_d;
F(2)=F(2)+f2_d;
end
步骤4:在主文件中,我将使用此函数与fsolve
来求解x(1)
和x(2)
的非线性方程组:
syms x
fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0);
root2d(x)
function F = root2d(x)
F(1) = (exp(-x(1)+2)/(1+exp(-x(1)+2)+exp(-x(2)+1)));
F(2) = (exp(-x(2)+1)/(1+exp(-x(1)+2)+exp(-x(2)+1)));
f1_d=diff(F(1),x(1));
f1_d=diff(F(2),x(2));
F(1)=F(1)+f1_d;
F(2)=F(2)+f2_d;
end
你能帮我吗,如何重写我的代码来求解导数,然后计算和求解系统?手工计算导数不是一种选择,因为以后我必须开发这个程序,我将有大约100个方程,而不是2个。
您要解决的一个基本问题是,使用fsolve
对该系统进行数值求解,然后混合使用符号数学。
由于你的函数F
似乎没有变化,它们的导数也不应该变化,所以你可以将它们创建为符号函数,并象征性地计算它们的导数一次:
syms x [1 2] real; % Create 1-by-2 symbolic vector
F = exp(-x+2)/(1+exp(-x(1)+2)+exp(-x(2)+1));
F_d(1) = diff(F(1),x(1));
F_d(2) = diff(F(2),x(2));
F = F+F_d; % Add derivatives to original functions
然后您可以将这些转换为数字形式,并使用fsolve
:进行求解
root2d = matlabFunction(F,'Vars',{x}); % Convert symbolic function to vectorized numeric function
x0 = [0 0];
x = fsolve(root2d,x0)
root2d(x)
注意,对于给定的初始猜测,fsolve
只找到一个根(如果成功的话(。强烈建议你绘制你的函数,以了解它的行为以及它可能有多少根。从我有限的绘图来看,上面定义的这个函数似乎没有任何零。另外,您还应该研究fsolve
的公差选项。
你可以研究纯数值(非符号(方法来解决这个问题,但你需要正确地用数值计算导数。你可以考虑一下这种方法。