利用matlab求解方程和方程组
本章会介绍如何利用matlab的内置函数求解方程与方程组
一、solve函数求解方程
1.求解单变量方程
solve(eqn, x)
对于单变量方程,在solve函数中的第一个参数需要输入我们用符号变量定义的等式,第二个参数为需要求解的变量。因为即使是单变量方程,里面的字符可能不止一个。
syms x
eqn = (sin(x) == 1); % eqn = sin(x) == 1;
answ = solve(eqn, x)
2.求解周期函数的解
因为三角函数是周期函数,如果要得到所有的解,则需要加上条件
返回的第二个参数是一个变量,而第三个参数则是这个变量需要满足的条件,以这个三角函数为例,求出解后的末尾应该要加上2kΠ,我们来看一下结果
syms x
eqn = (sin(x) == 1);
[answ, params, condions] = solve(eqn, x, 'ReturnConditions', true)
下面的结果给出了params的符号为k,而conditions则是k所需要满足的条件,为整数
answ = pi/2 + 2*pi*k
params = k
condions = in(k, 'integer')
3.求解多变量方程
与单变量一样,由于有多个符号,因此在第二个参数要设置好变量
syms a b c x
eqn = (a*x^2 + b*x + c == 0);
answ1 = solve(eqn, x) % 将x视为未知数求解
answ2 = solve(eqn, a) % 将a视为未知数求解
4.求解方程组
solve(eqn,[x1,x2])
求解方程组的形式与求解方程的写法一样,但是这里的eqn为一个向量(行列均可),而第二个参数则是要指定好需要求解的变量
syms u v a
eqn=[2*u+v==a;u-v==1];
solve(eqn,[u,v])
最后返回的ans会是一个结构体,里面储存着u,v的符号解
当然,也可以用一个向量直接储存符号解
[ansu,ansv]=solve(eqn,[u,v])
二、vpasolve函数求解方程
1.solve函数的缺点
solve函数进行求解复杂的函数时,可能会报错,而且在方程存在多个解时,只能返回一个解而且会报错,例如:
syms x
eqn = (sin(x) == x^2 - 1);
solve(eqn, x)
ans = -0.63673265080528201088799090383828
但其实我们画图可以看到,这个函数其实不止一个解(fplot函数可以绘制字符变量表示的图像)
fplot(sin(x), [-2 2])
hold on
fplot(x^2 - 1, [-2 2])
因此,选择用vpasolve函数更好地解决这个问题
2.vpasolve函数的用法
(1)用vpasolve函数指定求范围上的解
syms x
eqn = sin(x) == x^2 - 1;
vpasolve(eqn, x, [0 2])
当变量有多个时,第三个参数应该输入一个矩阵。如:vpasolve([eq1 eq2],[x y],[0 1; 1/2 2])
(2)用vpasolve函数给定搜索的起始点
vpasolve([eq1,...,eqn],[x1,...,xm],X0)
(3)用vpasolve函数进行随机指定范围进行搜索解
由于vpasolve函数一次只能返回一个解,但是方程并不总是有唯一解的,因此我们需要多次运行这个函数进行找解,然后用Uinique函数提取出所有的解,幸运的是,随机寻找这个过程我们只需要调用函数的命令就行了。
把random选项调节成true即可
vpasolve(eqn, x, 'random', true)
三、fsolve函数求解方程
fsolve是Matlab优化工具箱中的一个函数,可专门用来求解特别复杂的方程和方程组
1.创建待求函数文件
fsolve是一个优化函数,可以解决复杂的方程问题,他所接受的函数不能仅仅是一个字符变量,需要重新创造函数文件,而函数文件的格式也有要求。
(1)当需要求解方程组时,我们的函数其实就是一个向量,不同方程组用F(i)来表示;同时,需要保证方程的右边全为0,即把所有的数移到一边
(2)当有多个自变量x时,使用向量的调用方法进行调用,例如x(1),x(2)
function F = my_fun(x)
F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
end
2.fsolve函数用法
fsolve(@fun,x0)
第一个参数是处在同一文件夹下自己创建的m文件,第二个为初值
x0 = [0,0]; % 初始值
result_x = fsolve(@my_fun,x0)