MATLAB解隐函数方程时符号表达式转化为数值的方法-用vpa函数

今天在解决一个小问题时,遇到解隐函数方程,中间涉及一个解的传递问题,才好好研究了一下 syms这个语句的一些语法规则,最终用vpa这个函数解决了符号表达式到double数值的转化。
syms是符号函数,符号变量的优点是,使用符号变量运算得到的只是一个解析解,例如,在符号变量运算过程中pi就用pi表示,而不是具体的近似数值3.14或3.14159。MATLAB的符号计算是建立在MAPLE软件基础上的,所以在进行符号运算时,matlab首先将数据符号交予Maple软件进行计算,然后获取返回的结果。
这里简单总结一下在解方程时候 syms的应用:
1.解显函数构成的方程,显函数即通过化解,解析式中明显地能用一个变量的代数式表示另一个变量。这种比较简单,利用 subs 函数(将表达式中重复出现的字符串用变量代替)和subexpr(用于指定符号替换符号表达式的某一特定符号)即可。如:

syms x y a
f1=2*x^2-3*x+1;
f1V=subs(f1,1/3);  %使用1/3代替x
f2=x^2*y+5*x*sqrt(y);
f2V=subs(f2,x,3);  %使用3代替y
f2S=subs(f2,y,x);  %使用x代替y,使用y代替x
s=solve(x^2+a*x+1==0,x);  %求解方程
pretty(s);       %翼数学表达式方式显示方程的根
r=subexpr(s)          %替代方程的根

2.隐函数,即最后变量不能化到一边。应用 vpa函数进行转化!
一开始不知道怎么转化,每次输出结果都是含有一个wrightOmega的长式子,以为出错了。。后来查了半天才知道wrightOmega也是可以计算的!!如,

wrightOmega(1/2)
ans =
0.766248608161750

也就是说用wrightOmega是符号型表达的一种解析解,转为数值型的话,大小是一样额。需要注意的是我的 matla版本是2018b,很多低版本不支持这个。建议大家升级用最新版(我其他博文里有最新版下载云盘链接)
具体看例子

%函数功能:方程是log(1214.2/(I_out/X))/((I_out/X)-1)-X/1003=0,X是自变量,I_out是因变量(函数),对于第一次得到的I_out作为函数的自变量,进行迭代运算,观察方程解I_out的变化规律。
X=1312.5;
syms I_out;  
% I_in=6091.4 ;   %1351.2   1716.7  2118.1  2549.7  3006.5  3484.2  3979.7   4490.2   5013.5  5547.7  6091.4  6643.4
temp=zeros(1,20);
for i=1:20
    y=solve(log(1214.2/(I_out/X))/((I_out/X)-1)-X/1003==0, I_out);
    format long
    digits(6)
    **tt=vpa(y);**   %将符号表达式的值转化为数值型
    X=tt;          %将第一次方程结果作为下一次的输入(自变量),进行迭代
    temp(i)=tt;
    % stem(tt);hold on
end
figure();
t=1:1:length(temp);
% t=1:1:16;
plot(t,temp);
title("I_out值随迭代次数的变化");
xlabel("迭代次数");
ylabel("I_out值");

这里需要提醒一点就是,以后写解方程时候,一定写成y=solve(expression,x)这种形式。。一定注意!

你可能感兴趣的:(MATLAB)