MATLAB解方程(主要符号解法)

文章介绍了MATLAB中数值求解和符号求解的方法,包括二分法、牛顿法、割线法等数值方法,以及如何创建和操作符号对象。符号求解涉及符号变量的代换、转换和方程求解,强调了在处理符号变量时的注意事项,如使用subs函数和solve函数进行代换和解方程。此外,还提到了double和vpa函数在将符号对象转换为数值对象时的应用。
摘要由CSDN通过智能技术生成

 MATLAB求解:

分为数值求解和符号求解两种,前者诸如二分法、牛顿法、割线法,相关递推公式如下:

二分法:依次对比区间中点和两端的解,找到符合的区间。

牛顿法:x_{n+1}=x_n-\frac{f\left(x_n\right)}{f^\prime\left(x_n\right)}

割线法:x_{n+1}=x_n-\frac{x_n-x_{n-1}}{f\left(x_n\right)-f\left(x_{n-1}\right)}f\left(x_n\right)

下面主要介绍符号解法:

符号运算的操作对象主要是非数值的符号对象。

1、建立符号对象:

%     x = sym('x')
%     A = sym('a',[n1 ... nM])
%     A = sym('a',n)
%     syms var1 ... varN
%     syms var1 ... varN [n1 ... nM]
%     syms var1 ... varN n

符号对象分为符号常量和符号变量,可以通过sym(A)来创建一个值为A的符号常量。此时A是一个单独的数值。

示例如下:

a = 0.5;
b = '0.5';
c = sym(0.5);
d = sym('0.5');
classa = class(a)
classb = class(b)
classc = class(c)
classd = class(d)

结果: 

2、有时,我们需要将改变已有的符号变量。

比如在整个函数框架不变的情况下,改变某一个自变量的值。

符号变量的代换和数值转换与普通的变量不同,不能直接使用等号:

syms a b
subs(a+b,a,4)
syms a b
subs(cos(a)+sin(b),{a,b},{sym('alpha'),2})
syms a t
subs(exp(a*t),'a',-magic(2))
syms x y 
subs(x*y,{x,y},{[0 1;-1 0],[1 -1;-2 1]})

上述四个代码块的结果总结如下:

 需要注意,当多个符号变量都需要代换时,对应的变量集合和数值集合(只是这个例子中是数值)都要用{}放在一起。

3、将符号对象转换回数值对象

使用double()函数将符号对象转换为数值对象并得到数值解

a = sym(2*sqrt(2));
b = sym((1-sqrt(3))^2);
T=[a,b]
double(T)

在上面这段程序中,T代表的还是符号对象,是一个符号化的常量矩阵,double函数作用后,化为double类型的数值矩阵

结果如下:

 另一种解决方法是使用vpa()函数和digits()函数配合,展示代码如下:

q = vpa(sin(sym(pi)/4))
digits(25)%此处已经修改精度为25位
p = vpa(pi)
w = vpa(sym(pi),50)
classq = class(q)
classp = class(p)
classw = class(w)

两个函数配合和内嵌在vpa()函数内部这两种转换方式的含义是相同的,都是返回特定精度的数值(默认是32位)

需要注意,返回的数值类型是sym符号类型。

结果如下:

以及上述代码中sym函数内部有没有单引号也会导致结果不同,演示如下:

p = vpa(pi,32)
p = vpa('pi',32)

结果:

 可以看出,如果用单引号,MATLAB会当做符号\pi处理

4、运用符号变量求解代数方程

%help solve
% S = solve(eqn,var)
% S = solve(eqn,var,Name,Value)
% 
% Y = solve(eqns,vars)
% Y = solve(eqns,vars,Name,Value)

注意,当多变量方程求解,得到的解是一个“构架数组”。
当我们需要找到第一个解时(例),需要使用
% Y.var
下面我们求解一个三元方程组作为示例:

syms a b c x y z
[x,y,z] = solve([x*(x+y+z)-a,y*(x+y+z)-b,z*(x+y+z)-c],[x y z])

av = 6;
bv = 12;
cv = 18;

xv = subs(x,{a,b,c},[av bv cv])
yv = subs(y,{a,b,c},[av bv cv])
zv = subs(z,{a,b,c},[av bv cv])

需要注意的是:

1、如果在赋值时不新建变量,而是直接沿用a、b、c,仍然会得到符号化的解

2、和上面演示的subs函数用法一样,在变量替换时要用{}

3、方程组和变量组的组合要用[]

来源《高等光学仿真——光波导、激光》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值