在Matlab中求解一个非线性微分方程组



我想用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的公差选项。

你可以研究纯数值(非符号(方法来解决这个问题,但你需要正确地用数值计算导数。你可以考虑一下这种方法。

最新更新