利用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)
posted @ 2024-08-16 19:32  卢宇博  阅读(574)  评论(0编辑  收藏  举报