在MATLAB上求解方程组,当变量矩阵中存在常数时?
Solving system of equations on MATLAB, when a constant exists in variable matrix?
当变量向量的一个元素是常量时,如何在 MATLAB 上求解以下方程组?如果可能的话,请提供代码。
更一般地说,如果解决方案是使用符号数学,我将如何在求解之前生成大量变量,比如 12 个(而不是两个)?
例如,使用syms
创建多个符号变量,然后生成如下方程组。
syms a1 a2
A = [matrix]
x = [1;a1;a2];
y = [1;0;0];
eqs = A*x == y
sol = solve(eqs,[a1, a2])
sol.a1
sol.a2
如果你有一个有很多变量的系统,你可以使用syms
定义所有的符号,然后像上面那样解决它。
您还可以使用 fminsearch
执行参数优化。首先,您必须在单独的函数文件中定义成本函数,在本例中称为 cost_fcn.m
.
function J = cost_fcn(p)
% make sure p is a vector
p = reshape(p, [length(p) 1]);
% system of equations, can be linear or nonlinear
A = magic(12); % your system, I took some arbitrary matrix
sol = A*p;
% the goal of the system of equations to reach, can be zero, or some other
% vector
goal = zeros(12,1);
% calculate the error
error = goal - sol;
% Use a cost criterion, e.g. sum of squares
J = sum(error.^2);
end
此成本函数将包含您的方程组和目标解。这可以是任何类型的系统。向量 p
将包含正在估计的参数,这些参数将从一些初始猜测开始进行优化。要进行优化,您必须创建一个脚本:
% initial guess, can be zeros, or some other starting point
p0 = zeros(12,1);
% do the parameter optimization
p = fminsearch(@cost_fcn, p0);
在这种情况下,p0
是您提供给 fminsearch
的初始猜测。然后这个初始猜测的值将递增,直到找到成本函数的最小值。参数优化完成后,p
将包含使您的方程组误差最小的参数。然而,如果问题没有精确解,这可能是局部最小值。
您的系统过度约束,这意味着您的方程式多于未知数,因此您无法求解。您可以做的是使用 mldivide
找到最小二乘解。首先重新排列方程式,使等号右侧有所有常数项,然后使用 mldivide
:
>> A = [0.0297 -1.7796; 2.2749 0.0297; 0.0297 2.2749]
A =
0.029700 -1.779600
2.274900 0.029700
0.029700 2.274900
>> b = [1-2.2749; -0.0297; 1.7796]
b =
-1.274900
-0.029700
1.779600
>> A\b
ans =
-0.022191
0.757299
当变量向量的一个元素是常量时,如何在 MATLAB 上求解以下方程组?如果可能的话,请提供代码。
更一般地说,如果解决方案是使用符号数学,我将如何在求解之前生成大量变量,比如 12 个(而不是两个)?
例如,使用syms
创建多个符号变量,然后生成如下方程组。
syms a1 a2
A = [matrix]
x = [1;a1;a2];
y = [1;0;0];
eqs = A*x == y
sol = solve(eqs,[a1, a2])
sol.a1
sol.a2
如果你有一个有很多变量的系统,你可以使用syms
定义所有的符号,然后像上面那样解决它。
您还可以使用 fminsearch
执行参数优化。首先,您必须在单独的函数文件中定义成本函数,在本例中称为 cost_fcn.m
.
function J = cost_fcn(p)
% make sure p is a vector
p = reshape(p, [length(p) 1]);
% system of equations, can be linear or nonlinear
A = magic(12); % your system, I took some arbitrary matrix
sol = A*p;
% the goal of the system of equations to reach, can be zero, or some other
% vector
goal = zeros(12,1);
% calculate the error
error = goal - sol;
% Use a cost criterion, e.g. sum of squares
J = sum(error.^2);
end
此成本函数将包含您的方程组和目标解。这可以是任何类型的系统。向量 p
将包含正在估计的参数,这些参数将从一些初始猜测开始进行优化。要进行优化,您必须创建一个脚本:
% initial guess, can be zeros, or some other starting point
p0 = zeros(12,1);
% do the parameter optimization
p = fminsearch(@cost_fcn, p0);
在这种情况下,p0
是您提供给 fminsearch
的初始猜测。然后这个初始猜测的值将递增,直到找到成本函数的最小值。参数优化完成后,p
将包含使您的方程组误差最小的参数。然而,如果问题没有精确解,这可能是局部最小值。
您的系统过度约束,这意味着您的方程式多于未知数,因此您无法求解。您可以做的是使用 mldivide
找到最小二乘解。首先重新排列方程式,使等号右侧有所有常数项,然后使用 mldivide
:
>> A = [0.0297 -1.7796; 2.2749 0.0297; 0.0297 2.2749]
A =
0.029700 -1.779600
2.274900 0.029700
0.029700 2.274900
>> b = [1-2.2749; -0.0297; 1.7796]
b =
-1.274900
-0.029700
1.779600
>> A\b
ans =
-0.022191
0.757299