在MATLAB中自动生成方程组(Python中的类似问题)

在MATLAB中自动生成方程组(Python中的类似问题),matlab,Matlab,假设我想求解一个包含N未知变量的N方程组。假设方程的一般形式如下(我已经大大简化了它,我们可以假设每一行都等于零) 其中,x1,x2,…,xN是我的变量,const是前面在代码中确定的常数的长度向量。我事先不知道(即无法硬编码)有多少方程和变量,但我仍然希望以一般方式编写和求解系统 在MATLAB中,我当前的解决方案是执行以下操作,n_vars是我的程序前面确定的变量数 sym_vars = sym('x',[1 n_vars]); for i = 1:n_vars eqn(i) = s

假设我想求解一个包含
N
未知变量的
N
方程组。假设方程的一般形式如下(我已经大大简化了它,我们可以假设每一行都等于零)

其中,
x1
x2
,…,
xN
是我的变量,
const
是前面在代码中确定的常数的长度向量。我事先不知道(即无法硬编码)有多少方程和变量,但我仍然希望以一般方式编写和求解系统

在MATLAB中,我当前的解决方案是执行以下操作,
n_vars
是我的程序前面确定的变量数

sym_vars = sym('x',[1 n_vars]);
for i = 1:n_vars
    eqn(i) = sym_vars(i)-const(i);
end
这就建立了方程组<代码>eqn,我在上面展示过。我计划使用的所有数值解算器(例如,
fsolve
lsqnonlin
ode45
)都要求将方程组定义为函数句柄或单独的函数。我可以通过
matlabFunction
将符号表达式转换为函数句柄,或者,如果处理ODE,则通过
odeFunction
来解决这个问题

然而,我想解决这个方法的两个主要问题。首先,如果我只执行数值计算,我不想制作符号变量和依赖符号工具箱。第二个是,如果我求解ODE,变量实际上必须是
x1(t)
x2(t)
x3(t)
,…,
xN(t)
,才能正常工作。但是,使用与上面我的
sym
方法相同的逻辑以常规方式生成这些变量会导致警告,因为在将来的版本中不允许使用无效变量名的字符向量


如何使用函数句柄而不是符号变量(或等效解决方案)编写方程组?当然,一定有一种方法可以不用手动编写方程组。

使用向量函数,如

N=5;
const=1:5;
fsolve(@(x)x-const,zeros(1,N))
结果是:

1.0000    2.0000    3.0000    4.0000    5.0000

好吧,对于你介绍的案例,它只是
fun=@(x)x-c。怎么会这样?有
N
不同的变量,但您的变量只显示1。我希望
@(x)[x(1)-c(1),x(2)-c(2),…]
如果
x
c
都是长度相同的向量,
f
将是向量值函数。这个想法是数值模拟系统最有力的方法。如果
x=[x1;x2;x3;…]
c=[c1;c2;c3;…]
,那么
f1=@(x)x-c
将给出
[x1-c1;x2-c2;x3-c3;…]
。当我这样做时,例如:
c=[1,2,3,4];等式=@(x)x-c;求解(等式[0,0,0,0])它抛出一个错误,因为它期望一个初始条件,而不是4(那么,它不是一个变量,不是4吗?)
1.0000    2.0000    3.0000    4.0000    5.0000