如何通过传递更多变量定义函数来求解Matlab中的联立非线性方程

how to define function to solve simultaneous nonlinear equations in Matlab by passing more variables

我正在尝试在 Matlab 中使用 fsolve 命令求解非线性方程。我有一个主例程,我编写了一个函数,在其中定义了我要求解的方程式。

这是我的主要程序:

t = [338.9333333333,535.2,1217.4166666667,1797.3166666667,2082.9166666667,4557.0166666667,4690.2666666667,4717.5333333333,4981.3666666667,5346.9,5388.3166666667,5571.65,5619.65,6639.35,6719.35,7352.7666666667,7622.7666666667,7722.7666666667,7739.4333333333,7906.1,7909.7666666667,8502.7666666667,9852.7666666667,20571.0166666667,21368.6333333333,23948.6333333333,26789.6333333333,28598.6333333333,29828.6333333333,29859.6333333333,35469.6333333333,39938.6333333333,41186.6333333333,45956.6333333333,46378.6333333333,46496.6333333333,47493.6333333333,48958.6333333333,50228.6333333333,51716.6333333333,71876.6333333333];
 n= length(t);

 syms a b1 b2 amle b1mle b2mle
 tau=zeros;

for tau=2:n-1

fun = @root2d;
x0=[0.0002,0.00004];
x=fsolve(fun,x0)

tau=tau+1;  
end

并且我单独写了一个函数并将其保存为root2d.m,因为我无法将函数插入循环中。这是我的功能:

function F = root2d(x)
sum2=0;
for k=1:tau
   sum2 = sum2+(2/x(1))-t(k); 
    k=k+1;
end

sum3=0;
for l=tau+1:n
   sum3=sum3+(2/x(2))+t(tau)-t(l); 
    l=l+1;
end

F(1) = ((n*x(1)*(t(tau))^2)/(1-exp(x(1)*t(tau))+exp(x(1)*t(tau)-x(2)*(t(n)-t(tau)))*(1+x(2)*(t(n)-t(tau))))) + sum2;
F(2) = ((n*x(2)*(t(n)-t(tau))^2)/(1+x(2)*(t(n)-t(tau))+exp(x(2)*(t(n)-t(tau)))*((1+x(1)*t(tau))*exp(-x(1)*t(tau))-2))) + sum3;
end

但是,直到我在函数内定义 t、n 和 tau 时,这才起作用。我尝试将函数定义为 root2d(x,t,tau) 但它不起作用。有没有办法将变量传递给函数并解决这个问题?

您可以将 t、n 和 tau 参数添加到 root2d 函数:

function F = root2d(x, t, n, tau)
...
end

然后在主循环中你做

fun = @(x) root2d(x, t, n, tau);

现在 fun 是一个参数的函数,它使用所有需要的参数调用 root2d。