在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