惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
H
Help Net Security
V
Visual Studio Blog
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
MyScale Blog
MyScale Blog
The Cloudflare Blog
Martin Fowler
Martin Fowler
D
Docker
腾讯CDC
F
Fortinet All Blogs
雷峰网
雷峰网
GbyAI
GbyAI
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
博客园 - 叶小钗

鸦鸦的巢穴

母欲养而猫不待 - 鸦鸦的巢穴 又活半年 - 鸦鸦的巢穴 服务器廉价续费迁移教程 - 鸦鸦的巢穴 AD原理图添加ROOM及模块复制的方法(PCB更新不删除) - 鸦鸦的巢穴 2025幸福报告 - 鸦鸦的巢穴 NAS入坑笔记 | 网盘+相册+影视库+软路由 ALL IN ONE - 鸦鸦的巢穴 迄今为止最满意的GIF录屏软件 - 鸦鸦的巢穴 沃尔沃VOLVO工厂参观日记 - 鸦鸦的巢穴 Argon主题优化 | 将说说添加到RSS - 鸦鸦的巢穴 人物速写(三):表演型人格的底层逻辑 - 鸦鸦的巢穴 人物速写(二):采样心理学与宿命心理学 - 鸦鸦的巢穴 人物速写(一):自恋型人格障碍素材合辑 - 鸦鸦的巢穴 上班真是太爽了 - 鸦鸦的巢穴 九寨沟单人行 - 鸦鸦的巢穴 最喜欢的三款Typora主题 - 鸦鸦的巢穴 一个充电宝引发的争论:先有mAh还是先有Wh - 鸦鸦的巢穴 自建Meting API修复音乐播放器 - 鸦鸦的巢穴 P2P联机游戏加速之ZeroTier方案 - 鸦鸦的巢穴 PCB进阶指南 - 鸦鸦的巢穴 运算放大器&比较器应用指南 - 鸦鸦的巢穴 页面加载速度优化指南 - 鸦鸦的巢穴 教程 | 将博客朋友圈化——仅展示最近一个月动态 - 鸦鸦的巢穴 脑电波仅展示最近一个月动态,看到这条说明已经到底啦! - 鸦鸦的巢穴 PTC Mathcad 8.0 setup.exe 打不开/无反应解决办法 Word导出PDF图片模糊解决办法 & PPT制作海报导出图片分辨率不够解决办法 - 鸦鸦的巢穴 Microsoft Word 的文艺复兴 - 鸦鸦的巢穴 Zotero+阿里云盘WebDAV+公网访问≈无限空间+全平台 Altium Designer 重拾指南 | 菜鸟救星 - 鸦鸦的巢穴 Notion也可以有#文内标签# Matlab/Simulink批量运行仿真、参数寻优
Matlab求解函数solve、vpasolve和fsolve宠幸谁 - 鸦鸦的巢穴
鸦鸦 · 2023-11-20 · via 鸦鸦的巢穴

以经典的PI补偿器求解PI参数为例:

$$
20 \lg |k_p + \frac{k_i}{j \omega_c}| = gain\_rise
$$

$$
\frac{k_i}{k_p} = \omega_z
$$

第一个方程限定了补偿器在穿越频率处的增益,第二个方程拟定了零点位置。

(如果不懂涵义也没关系,这篇文章仅讨论针对类似的非线性方程组哪种求解函数最好用。如果想捋清楚各类补偿器的设计方法,后面单独写一篇文章。)

宫斗开始

首先淘汰fzero和roots这两个比较低端的函数,据说只支持单变量求解[1]

决赛圈还剩下solvevpasolvefsolve

  • solve:符号解或数值解,无需初始值,只需把方程等号改为双等号==。用法与vpasolve基本相同,感觉更为智能。
  • vpasolve:符号解或数值解,无需初始值,只需把方程等号改为双等号==。若有符号解时比较准,数值解经常无解或错解,慎用!
  • fsolve:仅数值解,必须给初值,方程组必须以函数句柄方式调用,右端为零。数值解比较准。

注:所谓解析解就是符号解;所谓函数句柄,可以理解为指针地址。

宠幸例子

已知参数:

wc = 2 * pi * 4e3;
gain_rise = 49.7481;
wz = 2 * pi * 100;

solve用例

syms kp ki
eqns = [20*log10(abs(kp + ki/(j*wc))) == gain_rise,
    ki/kp==wz];

[ki kp]=solve(eqns);

kp=double(kp)
ki=double(ki)

结果:

kp =
  307.0926
ki =
   1.9295e+05

vpasolve用例

syms kp ki
eqns = [20*log10(abs(kp + ki/(j*wc))) == gain_rise,
    ki/kp==wz];

[ki kp]=vpasolve(eqns)

结果:

ki =
192891.70190885358092200094503597 + 4821.8329924348312217466650244155i
kp =
306.99667840202430580932484824932 + 7.6741855550958895617299121076886i

fsolve用例

syms kp ki
eq1 = 20*log10(abs(kp + ki/(1i*wc))) - gain_rise;
eq2 = ki/kp - wz;
eqns = [eq1,eq2];

fun = @(vars) double(subs(eqns, [kp, ki], vars));
initial_guess = [1, 1];
sol = fsolve(fun, initial_guess);

kp = sol(1)
ki = sol(2)

结果:

kp =
  307.0924
ki =
   1.9295e+05

冠军加冕

用法上,solvevpasolve都十分简洁,fsolve由于句柄和初值的存在显得稍稍复杂,不过可以求助ChatGPT帮你写呀!

精度上,solvefsolve的结果都可以看作是正确的,vpasolve的复数解我也不知道是什么鬼,就算仅看实部,精度也不如其他两位小主,因此打入冷宫。

速度上,solvefsolve快。但fsolve真真是个很单纯的孩子,从迭代过程来看就是粗暴求解,用以检验会比较安心,而且其他两个无解的时候fsolve可能还会有解。

我宣布,solve是本届Matlab求解函数宫斗冠军。