我想要通过MATLAB求解一个多元方程组,但方程组里包含的参数还需要许多其它复杂语句来表达,而这些语句又涉及包含变量的条件句和插值函数语句。
为了更好地说明这个问题,我将问题简化为一个二元方程组问题进行举例,编写的语句如下:
syms x y
a=x+y;
if x>0
b=1;
else
b=2;
end
eqns = [a + b*x == 1, a - b == 2];
S=solve(eqns,[x y]);
但上述程序是无法运行的,报错提示为“无法从 sym 转换为 logical”,说明条件句里含有变量是无法运行的。而我实际要求的问题还会更加复杂,包含多句含有变量的条件句、插值函数语句。
请问这样的方程组有可能通过MATLAB求解吗?该如何求解呢?烦请能提供思路,万分感激!
要么用solve支持的sign(指示数值正负)函数强行捏造一个分段函数:
syms x y
a=x+y;
b=ceil((3+sign(1))/2);
eqns = [a + b*x == 1, a - b == 2];
S=solve(eqns,[x y])
S =
包含以下字段的 struct:
x: -3/2
y: 11/2
要么干脆换个求解器
function pwdemo
function y = myEqns(x)
a=x(1)+x(2);
if x>0
b=1;
else
b=2;
end
y=[a + b*x(1)-1, a - b-2];
end
opts=optimoptions("fsolve", "Algorithm", "levenberg-marquardt");
sol=fsolve(@myEqns, [0.0; 0.0], opts)
end
sol =
-1.5000
5.5000
syms R1 R2 C1 C2;
eqns =[R1/(50piC1R1+1 )-R1/(10piC1R1+1)+R2/(50piC2R2+1)-R2/(10piC2R2+1) == -3.994933399101286e-06,
R1/(100piC1R1+1)-R1/(10piC1R1+1)+R2/(100piC2R2+1)-R2/(10piC2R2+1) == -8.684603855561163e-06,
R1/(200piC1R1+1)-R1/(10piC1R1+1)+R2/(200piC2R2+1)-R2/(10piC2R2+1) == -1.107385456040715e-05,
R1/(300piC1R1+1)-R1/(10piC1R1+1)+R2/(300piC2R2+1)-R2/(10piC2R2+1) == -1.268323914108138e-05];
vars = [R1 R2 C1 C2];
[solR1 solC1 solR2 solC2] = solve(eqns,vars);%此处不加分号可直接输出解析解,与数值解共同显示
solutions = [solR1 solC1 solR2 solC2]; %将各对解析解放到一个矩阵中
fans=vpa(solutions,4) % 将矩阵中的解析解变换成数值解,并保留到小数点后四位
该命令主要实现的是四元分数方程组求解出四个未知量,主要用到了两个关键函数:solve函数、vpa函数,关于solve与vpa的使用方法在matlab help中可以具体查询使用