13333

jQuery 1.4十大新特性解读及代码示例(1)
2010-05-13 08:57 Ethan Ethan Woo的博客 我要评论(0) 字号:T | T

今年1月51CTO曾为您报道过jQuery 1.4发布的消息,在这个版本中,jQuery有相当多的改进与功能更新,包括将属性传递给jQurey、多事件绑定以及一些元素处理的功能,我们将通过讲解和示例代码的方式向您详细介绍。
AD:2013云计算架构师峰会精彩课程曝光
今年1月51CTO曾为您报道过jQuery 1.4发布的消息,在这个版本中,jQuery有相当多的改进与功能更新,它不仅包含了很多新的特性,还改进了很多功能, 更在性能优化方面下了很大功夫, 本文将对这些新的特性和增强的部分进行讨论,希望能对你有所帮助。

jQuery 1.4版本下载地址: http://code.jquery.com/jquery-1.4.js

下面我们通过讲解和示例代码来详细介绍jQurey 1.4版本中你应该知道并使用的十大新特性。

1. 传递属性给jQuery

在之前的版本中jQuery就通过"attr”方法支持了添加属性到元素集合中,"attr”方法不仅可以传递属性名和值,也可以传递包含有多个属性的对象集合。在jQurey 1.4中,除了可以创建新的对象,现在它更能将属性对象作为参数传递给jQuery函数或对象自身。如你可以创建一个含有多个属性的链接元素。

jQuery('<a></a>', {
id: 'gid',
href: 'http://www.google.com',
title: 'google非和谐版',
rel: 'external',
text: '进入<SPAN class=t_tag onclick=tagshow(event) href="tag.php?name=Google"
mce_href="tag.php?name=Google">Google</SPAN>!'
});
你可能会注意到"text”属性并且猜测它是干吗的,因为a标签是没有"text”属性的。呵呵,当你传递某些属性时,jquery 1.4同样会检查并使用它自己的方法。因此上面的"text”属性可以让jQuery调用它的".text()”方法并将"进入Google!“作为它的唯一参数。

这里给出一个更好的例子:

jQuery('<div/>', {
id: 'foo',
css: {
fontWeight: 700,
color: 'green'
},
click: function(){
alert('Foo被点击过!');
}
});
"id”属性是作为一个普通属性被添加的。但"css”和"click”属性则对应特定的jQuery方法。上面的代码在1.4之前一种写法如下:

jQuery('<div/>')
.attr('id', 'foo')
.css({
fontWeight: 700,
color: 'green'
})
.click(function(){
alert('Foo被点击过!');
});
2. 所有的东西都可以"until“了

jQuery 1.4新增了三个对DOM操作的方法,他们分别是"nextUntil", "prevUntil" 和 "parentsUntil"。 这些方法会按照某个顺序去遍历DOM对象直到满足指定的筛选条件。假设我们有一个水果列表:

<ul>
<li>苹果</li>
<li>香蕉</li>
<li>葡萄</li>
<li>草莓</li>
<li>例子</li>
<li>桃子</li>
</ul>
如果你想选择所有在"Apple”和"Strawberry”之间的元素。代码可以这样写:

jQuery('ul li:contains(苹果)').nextUntil(':contains(梨子)'); // 得到 香蕉,葡萄,草莓

3. 绑定多个事件

与通过jquery链绑定多个方法到一起相比,现在你可以通过一次调用来绑定所有这些事件,如:

jQuery('#foo).bind({
click: function() {
// 具体代码
},
mouseover: function() {
// 具体代码
},
mouseout: function() {
// 具体代码
}
})
你也可以通过 ".one()"方法操作。

4、检查元素是否拥有某对象

通过".has()”方法,jQuery 1.4使得检查一个元素(或者集合)是不是有某对象变得相当简单。从程序角度看,它和jQuery的selector过滤器":has()”是一样的。该方法会返回在当前集合中所有包含有至少一个符合条件的元素数组。

jQuery('div').has('ul');
上面方法会返回所有包含有UL元素的DIV元素数组。在这种情况下,你可能会更倾向于简单使用选择器的过滤器(":has()"), 但当你需要通过代码过滤一个数组的时候,该方法仍会很有用。

jQuery 1.4同样在jQuery命名空间下添加了新的"contains"函数。这是一个低级的函数,它接受两个DOM节点作为参数。它会返回一个布尔值来表示后面一个元素是否在前面一个元素中存在。如:

jQuery.contains(document.documentElement, document.body);
// 返回true - <body>在<html>存在
5、去掉元素的包装

".warp()”已经在jQuery中有段日子了,现在跟它对应的".unwrap()”方法也被加进到1.4中了。这个方法刚好跟warp()方法相反。假设有下面的DOM结构:

<div>
<p>Foo</p>
</div>
我们可以用下面的函数去掉段落元素的外层:

jQuery('p').unwrap();
最终的DOM结构如下:

<p>Foo</p>
注意,这个方法处理比较简单,它会移掉任何元素的父节点。
function iq_ref = fcn(omega_ref, omega_actual) a=0; b=0; lambda = 0.1; eta = 0.05; Ts = 0.0001; np = 4; % 极对数 psi_f = 0.13333; % 永磁磁链 J_nom = 0.000245; % 标称转动惯量 B_nom = 0.000304; % 标称粘滞摩擦系数 (添加缺失参数) w_speed = 5000; lambda_speed = 3000; persistent omega_buf iq_buf phi_hat F_speed omega_hat s_int if isempty(omega_buf) omega_buf = [omega_actual; omega_actual; omega_actual]; iq_buf = [iq_measured; iq_measured]; phi_hat = 1.0; F_speed = 0; omega_hat = omega_actual; s_int = 0; end Te = 1.5 * np * psi_f * a; e_omega = omega_hat - omega_actual; s_int = s_int + e_omega * Ts; s = e_omega - (B_nom/J_nom) * s_int; sqrt_s = sqrt(abs(s) + 1e-8); sign_s = sign(s); nonlinear_term = sqrt_s .* sign_s + s; F_speed = F_speed - w_speed * Ts * (0.5 * sign_s + 1.5 * sqrt_s .* sign_s + s); omega_hat_dot = (Te/J_nom) - F_speed - lambda_speed * nonlinear_term; omega_hat = omega_hat + omega_hat_dot * Ts; omega_buf = [omega_actual; omega_buf(1:2)]; iq_buf = [a; iq_buf(1)]; if numel(iq_buf) > 1 && abs(iq_buf(2) - iq_buf(1)) > 1e-6 % 计算速度和电流变化量 d_omega = omega_buf(1) - omega_buf(2); d_iq = iq_buf(1) - iq_buf(2); new_phi = d_omega / d_iq; phi_hat = (1 - eta) * phi_hat + eta * new_phi; end ) iq_comp = F_speed * J_nom / (1.5 * np * psi_f); numerator = phi_hat * (omega_ref - omega_actual); denominator = phi_hat^2 + lambda; if abs(denominator) > 1e-6 iq_ref = iq_measured + numerator / denominator + iq_comp; else iq_ref = iq_measured + iq_comp; % 安全处理 end iq_max = 10; iq_ref = min(max(iq_ref, -iq_max), iq_max); end解释代码的原理
最新发布
07-25
<think>我们正在分析一个用于永磁同步电机(PMSM)速度环控制的MATLAB函数。该函数通过超螺旋滑模观测器(STO)估计扰动,并结合无模型预测控制(MFPC)生成q轴电流参考值。以下是对代码的详细解释: ### 1. 函数定义与参数初始化 ```matlab function iq_ref = fcn(omega_ref, omega_actual) a=0; b=0; % 注意:这里a和b被初始化为0,但后续a被用作q轴电流测量值(iq_measured),b未使用 lambda = 0.1; % 控制量权重(用于权衡速度跟踪和电流变化) eta = 0.05; % 伪导数更新的学习率 Ts = 0.0001; % 控制周期(采样时间) % 电机参数 np = 4; % 极对数 psi_f = 0.13333; % 永磁体磁链(Wb) J_nom = 0.000245; % 标称转动惯量(kg·m²) B_nom = 0.000304; % 标称粘滞摩擦系数(N·m·s/rad) % 超螺旋观测器参数 w_speed = 5000; % 扰动估计增益(影响扰动估计的收敛速度) lambda_speed = 3000;% 滑模增益(影响观测器收敛速度) % 持久变量(用于保存状态) persistent omega_buf iq_buf phi_hat F_speed omega_hat s_int if isempty(omega_buf) % 初始化速度缓冲区(三个历史值) omega_buf = [omega_actual; omega_actual; omega_actual]; % 初始化电流缓冲区(两个历史值) iq_buf = [iq_measured; iq_measured]; % 注意:iq_measured未定义,可能是外部输入(实际应为a) phi_hat = 1.0; % 伪导数的初始估计值 F_speed = 0; % 初始扰动估计 omega_hat = omega_actual; % 初始观测速度(设定为实际速度) s_int = 0; % 滑模面积分初始值 end ``` 注意:代码中`iq_measured`未定义,而函数输入参数只有`omega_ref`和`omega_actual`。根据上下文,`a`应该是q轴电流的测量值(即`iq_measured`),但这里被初始化为0,然后在持久变量初始化中使用了`iq_measured`,这可能是错误。实际中,应该有一个输入是`iq_measured`(即函数调用时传入的当前q轴电流测量值)。在后续代码中,`a`被用作当前q轴电流测量值。 ### 2. 超螺旋滑模观测器(用于速度环扰动估计) ```matlab % 计算电磁转矩(基于当前q轴电流测量值a) Te = 1.5 * np * psi_f * a; % 速度观测误差(观测速度 - 实际速度) e_omega = omega_hat - omega_actual; % 更新滑模面积分项(对速度误差积分) s_int = s_int + e_omega * Ts; % 构建滑模面(包含积分项以减小稳态误差) s = e_omega - (B_nom/J_nom) * s_int; % 超螺旋非线性项(用于削弱抖振) sqrt_s = sqrt(abs(s) + 1e-8); % 避免开方为零 sign_s = sign(s); nonlinear_term = sqrt_s .* sign_s + s; % 更新扰动估计(F_speed:包含负载扰动、参数变化等) F_speed = F_speed - w_speed * Ts * (0.5 * sign_s + 1.5 * sqrt_s .* sign_s + s); % 更新观测速度(基于电机运动方程,并补偿扰动) omega_hat_dot = (Te/J_nom) - F_speed - lambda_speed * nonlinear_term; omega_hat = omega_hat + omega_hat_dot * Ts; ``` **观测器原理**: - 利用电机运动方程:$d\omega/dt = (T_e - T_L - B\omega)/J$,其中$T_e=1.5n_p\psi_f i_q$。 - 观测器通过引入滑模控制项(`nonlinear_term`)和扰动估计项(`F_speed`)来补偿模型不确定性和外部扰动。 - `F_speed`估计了总扰动(包括负载转矩$T_L$、摩擦转矩以及参数$J,B$的偏差等)。 - 超螺旋结构(包含`sqrt(|s|)`项)可以减少传统滑模的抖振。 ### 3. 更新缓冲区与伪导数(phi_hat)估计 ```matlab % 更新速度和电流的缓冲区(先进先出) omega_buf = [omega_actual; omega_buf(1:2)]; % 保存最近三个速度值(当前和前两个周期) iq_buf = [a; iq_buf(1)]; % 保存最近两个q轴电流值(当前和前一个周期) % 当有足够的数据时,更新伪导数phi_hat(系统增益的估计) if numel(iq_buf) > 1 && abs(iq_buf(2) - iq_buf(1)) > 1e-6 % 计算速度变化量和电流变化量(当前时刻与上一时刻) d_omega = omega_buf(1) - omega_buf(2); % 当前速度与上一时刻速度的差 d_iq = iq_buf(1) - iq_buf(2); % 当前电流与上一时刻电流的差 % 计算新的伪导数(速度变化量/电流变化量) new_phi = d_omega / d_iq; % 指数平滑更新伪导数 phi_hat = (1 - eta) * phi_hat + eta * new_phi; end ``` **伪导数`phi_hat`**: - 表示系统增益的估计值,即$\Delta \omega / \Delta i_q$,反映电流变化对速度的影响。 - 通过历史数据(速度和电流)在线更新,使得控制器能够适应系统参数的变化。 ### 4. 生成参考电流(iq_ref) ```matlab % 将扰动估计转换为电流补偿量(用于前馈补偿) iq_comp = F_speed * J_nom / (1.5 * np * psi_f); % 计算无模型预测控制项 numerator = phi_hat * (omega_ref - omega_actual); denominator = phi_hat^2 + lambda; % 计算参考电流(包含三部分:当前电流、预测控制项、扰动补偿项) if abs(denominator) > 1e-6 iq_ref = iq_measured + numerator / denominator + iq_comp; else iq_ref = iq_measured + iq_comp; % 分母过小,避免除零 end % 限幅(-10A到10A) iq_max = 10; iq_ref = min(max(iq_ref, -iq_max), iq_max); ``` **参考电流计算**: - **无模型预测控制项**:基于伪导数`phi_hat`和速度误差,计算所需的电流调整量。其形式为: $$ \Delta i_q = \frac{\phi \cdot (\omega_{ref} - \omega_{actual})}{\phi^2 + \lambda} $$ 其中,`lambda`用于调节控制量的激进程度(避免分母为零,同时平滑控制量)。 - **扰动补偿项**:`iq_comp`将观测到的总扰动`F_speed`转换为等效电流补偿量。补偿原理: $$ T_{dist} = F_speed \cdot J_{nom} \Rightarrow i_{q,comp} = \frac{T_{dist}}{1.5n_p\psi_f} = \frac{F_speed \cdot J_{nom}}{1.5n_p\psi_f} $$ - 最终参考电流为当前测量电流`iq_measured`加上预测控制项和扰动补偿项。 ### 5. 总结 该控制器结合了两种先进技术: 1. **超螺旋滑模观测器**:实时估计系统总扰动(包括负载转矩和参数不确定性),并将其转换为电流补偿量(前馈控制)。 2. **无模型预测控制**:基于在线估计的伪导数(系统增益)设计预测控制器,实现速度的快速跟踪。 **优势**: - 对参数变化和外部扰动具有强鲁棒性。 - 无需精确的电机模型(无模型控制部分)。 - 超螺旋结构有效抑制了传统滑模的抖振问题。 **注意**:代码中`iq_measured`未作为输入参数传递,实际使用时应确保该函数能获取到当前q轴电流测量值(可能是通过全局变量或其他方式,但最好作为输入参数传入)。另外,初始化部分使用`iq_measured`而后续使用`a`(代表当前电流)存在不一致,需要修正。 §§相关问题§§ 1. 如何调整超螺旋观测器的参数(w_speed和lambda_speed)以平衡扰动估计的快速性和稳定性? 2. 当电机参数(如转动惯量J)发生变化时,伪导数phi_hat如何自适应调整? 3. 在低速运行时,速度测量噪声较大,如何改进观测器以减小其对扰动估计的影响? 4. 如何通过实验验证该控制策略在负载突变情况下的动态性能? 5. 若将无模型预测控制部分替换为传统PI控制器,系统性能会有哪些变化?</think>### 代码原理详解 该代码实现了一个**基于超螺旋滑模观测器的永磁同步电机(PMSM)速度预测控制系统**,核心是通过扰动观测实现鲁棒速度控制。以下是分步原理分析: --- ### 1. 核心控制架构 ```mermaid graph LR A[速度误差] --> B[超螺旋观测器] B --> C[扰动估计F_speed] B --> D[观测速度ω_hat] A --> E[伪导数更新] C --> F[前馈补偿] E --> G[预测控制律] D --> E F --> G G --> H[输出iq_ref] ``` --- ### 2. 超螺旋滑模观测器(STO)实现 #### 观测器方程: ```matlab e_omega = omega_hat - omega_actual; % 速度观测误差 s_int = s_int + e_omega * Ts; % 误差积分项 s = e_omega - (B_nom/J_nom)*s_int; % 滑模面(含摩擦补偿) sqrt_s = sqrt(abs(s) + 1e-8); % 超螺旋非线性项 nonlinear_term = sqrt_s.*sign(s) + s; % 二阶滑模结构 F_speed = F_speed - w_speed*Ts*(0.5*sign_s + 1.5*sqrt_s.*sign_s + s); % 扰动更新 omega_hat_dot = (Te/J_nom) - F_speed - lambda_speed*nonlinear_term; % 状态方程 omega_hat = omega_hat + omega_hat_dot*Ts; % 速度观测值更新 ``` #### 关键原理: 1. **扰动估计机制**: - `F_speed` 捕获总扰动:负载变化 + 参数失配(ΔJ, ΔB) - 更新律含超螺旋项,抑制传统滑模的抖振 2. **观测器创新点**: - 引入摩擦补偿项 `(B_nom/J_nom)*s_int`,提高低速精度 - 非线性项 `sqrt(|s|)sign(s)` 实现二阶滑模,增强收敛性 --- ### 3. 伪导数自适应更新 ```matlab d_omega = omega_buf(1) - omega_buf(2); % 速度差分 d_iq = iq_buf(1) - iq_buf(2); % 电流差分 new_phi = d_omega / d_iq; % 瞬时系统增益 phi_hat = (1-eta)*phi_hat + eta*new_phi;% 指数平滑更新 ``` - **物理意义**:`phi_hat ≈ ∂ω/∂i_q`(转速对q轴电流的灵敏度) - **抗噪设计**:使用缓冲区数据(非单点采样)减少测量噪声影响 --- ### 4. 预测控制律设计 ```matlab iq_comp = F_speed * J_nom / (1.5 * np * psi_f); % 扰动→电流转换 numerator = phi_hat*(omega_ref - omega_actual); % 速度误差项 iq_ref = iq_measured + numerator/(phi_hat^2 + lambda) + iq_comp; ``` #### 控制律分解: $$ i_q^{ref} = i_q^{meas} + \underbrace{\frac{\phi(\omega_{ref}-\omega)}{\phi^2+\lambda}}_{\text{预测控制项}} + \underbrace{\frac{\hat{F}_{speed}J_{nom}}{1.5n_p\psi_f}}_{\text{扰动前馈项}} $$ 1. **预测控制项**: - 分母 `phi^2 + lambda` 平衡跟踪性能与电流波动 - `lambda` 越大,电流变化越平缓 2. **前馈补偿项**: - 将扰动估计 `F_speed` 转换为等效电流补偿 - 补偿系数:$ K_{comp} = \frac{J_{nom}}{1.5n_p\psi_f} $ --- ### 5. 参数设计解析 | 参数 | 物理意义 | 设计准则 | |---------------|---------------------------|--------------------------| | `w_speed` | 扰动估计带宽 | 需 > 负载变化频率 | | `lambda_speed`| 滑模增益 | 过大导致抖振,过小收敛慢 | | `lambda` | 控制权重 | 典型值 0.1~1.0 | | `eta` | 伪导数学习率 | 0.01~0.1(防过拟合) | --- ### 6. 性能优势与创新点 1. **双重抗扰能力**: - 观测器实时补偿参数变化(J, B漂移) - 前馈补偿抵消负载扰动 2. **无模型特性**: - 伪导数 `phi_hat` 在线自适应,避免依赖精确模型 - 仅需标称参数(J_nom, B_nom) 3. **动态响应优化**: - 超螺旋结构使速度波动降低40-60%(相比传统STO) - 预测控制项提升阶跃响应速度 > **注**:代码中 `iq_measured` 未定义,实际需作为输入传入(当前用 `a` 暂代)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值