LC 593. Valid Square

本文介绍了一种算法,用于判断二维空间中给定的四个点是否能构成一个正方形。通过比较边长和对角线长度,该算法能够快速判断输入点是否满足正方形的条件。

Given the coordinates of four points in 2D space, return whether the four points could construct a square.

The coordinate (x,y) of a point is represented by an integer array with two integers.

Example:

Input: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
Output: True

 

Note:

  1. All the input integers are in the range [-10000, 10000].
  2. A valid square has four equal sides with positive length and four equal angles (90-degree angles).
  3. Input points have no order.

 

从边入手,如果四个点不重合,那么形成的四条边加两个对角线只可能有两个情况,且对角线要长。

Runtime: 16 ms, faster than 57.63% of Java online submissions for Valid Square.

 

class Solution {
  public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
    int[][] p = {{p1[0],p1[1]},{p2[0],p2[1]},{p3[0],p3[1]},{p4[0],p4[1]}};
    int cnt = 0;
    int[] len = new int[6];
    for(int i=0; i<4; i++){
      for(int j=i+1; j<4 ;j++){
        if(p[i][0] == p[j][0] && p[i][1] == p[j][1]) return false;
        len[cnt++] = (p[i][0]-p[j][0])*(p[i][0]-p[j][0])+(p[i][1]-p[j][1])*(p[i][1]-p[j][1]);
      }
    }
    Arrays.sort(len);
    if(len[0] == len[2] && len[4] == len[5] && len[4] > len[1]){
      return true;
    }
    return false;
  }
}

 

转载于:https://www.cnblogs.com/ethanhong/p/10278001.html

<think>我们面对的是一个复杂的电路阻抗公式,需要将其解析为可计算的形式。公式如下: $$ z = \frac{R_{c1} \cdot \left( L_{c1} \cdot w \cdot j + \frac{R_{c2} \cdot \left( L_{c2} \cdot w \cdot j + \frac{R_{c3} \cdot (R_{c4} + L_{c3} \cdot w \cdot j)}{R_{c3} + R_{c4} + L_{c3} \cdot w \cdot j} \right)}{R_{c2} + L_{c2} \cdot w \cdot j + \frac{R_{c3} \cdot (R_{c4} + L_{c3} \cdot w \cdot j)}{R_{c3} + R_{c4} + L_{c3} \cdot w \cdot j}} \right)}{R_{c1} + L_{c1} \cdot w \cdot j + \frac{R_{c2} \cdot \left( L_{c2} \cdot w \cdot j + \frac{R_{c3} \cdot (R_{c4} + L_{c3} \cdot w \cdot j)}{R_{c3} + R_{c4} + L_{c3} \cdot w \cdot j} \right)}{R_{c2} + L_{c2} \cdot w \cdot j + \frac{R_{c3} \cdot (R_{c4} + L_{c3} \cdot w \cdot j)}{R_{c3} + R_{c4} + L_{c3} \cdot w \cdot j}}} $$ 其中 $j$ 是虚数单位(在数学中常用$i$,但电路中常用$j$),$w$ 是角频率。 ### 目标 将上述公式转换为适合在MATLAB或Python中计算的函数形式,以便计算不同频率下的阻抗值。 ### 步骤 1. **识别变量和参数**: - 变量:$w$(角频率) - 参数:$R_{c1}, L_{c1}, R_{c2}, L_{c2}, R_{c3}, R_{c4}, L_{c3}$(这些是电路元件参数) 2. **将公式分解为子表达式**: 为了减少重复计算和增加可读性,我们可以将公式分解为多个子表达式。观察公式,发现存在重复的部分,例如: - 表达式 $A = R_{c4} + L_{c3} \cdot w \cdot j$ - 表达式 $B = R_{c3} + R_{c4} + L_{c3} \cdot w \cdot j = R_{c3} + A$ 然后,我们可以定义: - $C = \frac{R_{c3} \cdot A}{B}$ 接着,定义: - $D = L_{c2} \cdot w \cdot j + C$ - $E = R_{c2} + L_{c2} \cdot w \cdot j + C = R_{c2} + D$ 然后,$F = \frac{R_{c2} \cdot D}{E}$ 再定义: - $G = L_{c1} \cdot w \cdot j + F$ - $H = R_{c1} + L_{c1} \cdot w \cdot j + F = R_{c1} + G$ 最后,阻抗 $z = \frac{R_{c1} \cdot G}{H}$ 3. **编写计算函数**: 根据上述分解,我们可以编写一个函数,输入参数为频率(或角频率)和电路参数,输出阻抗值。 ### MATLAB实现 在MATLAB中,我们可以使用以下函数计算阻抗: ```matlab function Z = calculate_impedance(w, Rc1, Lc1, Rc2, Lc2, Rc3, Rc4, Lc3) % 计算阻抗 j = 1i; % 虚数单位 % 子表达式 A, B, C A = Rc4 + Lc3 * w * j; B = Rc3 + Rc4 + Lc3 * w * j; % 注意:这里实际上是Rc3 + A,但A=Rc4+Lc3*w*j,所以B=Rc3 + Rc4 + Lc3*w*j C = (Rc3 * A) / B; % 子表达式 D, E D = Lc2 * w * j + C; E = Rc2 + Lc2 * w * j + C; % 也就是 Rc2 + D F = (Rc2 * D) / E; % 子表达式 G, H G = Lc1 * w * j + F; H = Rc1 + Lc1 * w * j + F; % 也就是 Rc1 + G % 阻抗 Z Z = (Rc1 * G) / H; end ``` ### Python实现 在Python中,我们可以使用复数(用`j`表示虚数单位)来实现: ```python def calculate_impedance(w, Rc1, Lc1, Rc2, Lc2, Rc3, Rc4, Lc3): # 计算阻抗 j = 1j A = Rc4 + Lc3 * w * j B = Rc3 + Rc4 + Lc3 * w * j C = (Rc3 * A) / B D = Lc2 * w * j + C E = Rc2 + Lc2 * w * j + C # 即 Rc2 + D F = (Rc2 * D) / E G = Lc1 * w * j + F H = Rc1 + Lc1 * w * j + F # 即 Rc1 + G Z = (Rc1 * G) / H return Z ``` ### 使用示例 假设我们有一组电路参数,并想计算在角频率$w=2\pi f$($f$为频率)下的阻抗: ```matlab % MATLAB示例 Rc1 = 100; Lc1 = 0.1; Rc2 = 200; Lc2 = 0.2; Rc3 = 300; Rc4 = 400; Lc3 = 0.3; f = 50; % 频率50Hz w = 2 * pi * f; Z = calculate_impedance(w, Rc1, Lc1, Rc2, Lc2, Rc3, Rc4, Lc3); disp(['阻抗实部: ', num2str(real(Z)), ' 欧姆']); disp(['阻抗虚部: ', num2str(imag(Z)), ' 欧姆']); ``` ```python # Python示例 import numpy as np Rc1, Lc1, Rc2, Lc2, Rc3, Rc4, Lc3 = 100, 0.1, 200, 0.2, 300, 400, 0.3 f = 50 # 频率50Hz w = 2 * np.pi * f Z = calculate_impedance(w, Rc1, Lc1, Rc2, Lc2, Rc3, Rc4, Lc3) print(f"阻抗实部: {Z.real} 欧姆") print(f"阻抗虚部: {Z.imag} 欧姆") ``` ### 注意事项 1. **复数运算**:在编程中,虚数单位在MATLAB中用`1i`或`1j`,在Python中用`1j`。 2. **频率范围**:如果需要计算多个频率点的阻抗,可以循环调用该函数,或者向量化处理(在MATLAB中注意使用点乘,在Python中使用NumPy数组)。 3. **性能**:由于公式已经分解,每次计算都是线性操作,效率较高。 ### 扩展:计算频响曲线 通常我们需要计算一定频率范围内的阻抗,并绘制幅频特性和相频特性曲线。以下是在MATLAB中的示例: ```matlab freqs = logspace(1, 5, 1000); % 从10Hz到100kHz,1000个对数间隔点 w_vec = 2 * pi * freqs; Z_vec = zeros(size(w_vec)); for i = 1:length(w_vec) Z_vec(i) = calculate_impedance(w_vec(i), Rc1, Lc1, Rc2, Lc2, Rc3, Rc4, Lc3); end % 绘制幅频特性 subplot(2,1,1); loglog(freqs, abs(Z_vec)); xlabel('频率 (Hz)'); ylabel('阻抗模值 (欧姆)'); grid on; % 绘制相频特性 subplot(2,1,2); semilogx(freqs, angle(Z_vec)*180/pi); xlabel('频率 (Hz)'); ylabel('相位 (度)'); grid on; ``` 在Python中,可以使用NumPy和Matplotlib实现类似功能。 ### 总结 通过将复杂的阻抗公式分解为多个子表达式,我们实现了在MATLAB和Python中的阻抗计算函数。这为后续的电路分析、参数拟合(如使用`lsqnonlin`)等任务奠定了基础[^1]。 §§相关问题§§ 1. 如何将上述阻抗计算结果导出为CSV文件? 2. 如何利用上述阻抗函数进行电路参数拟合(如使用最小二乘法)? 3. 如何优化上述代码以支持向量化输入(一次计算多个频率点)?</think>### 解析复杂电路阻抗公式的完整指南 您提供的电路阻抗公式是一个多层嵌套的RLC网络表达式,我将逐步解析其结构和计算方法。公式如下: $$ z = \frac{R_{c1} \cdot \left( L_{c1} \cdot \omega \cdot j + \frac{R_{c2} \cdot \left( L_{c2} \cdot \omega \cdot j + \frac{R_{c3} \cdot (R_{c4} + L_{c3} \cdot \omega \cdot j)}{R_{c3} + R_{c4} + L_{c3} \cdot \omega \cdot j} \right)}{R_{c2} + L_{c2} \cdot \omega \cdot j + \frac{R_{c3} \cdot (R_{c4} + L_{c3} \cdot \omega \cdot j)}{R_{c3} + R_{c4} + L_{c3} \cdot \omega \cdot j}} \right)}{R_{c1} + L_{c1} \cdot \omega \cdot j + \frac{R_{c2} \cdot \left( L_{c2} \cdot \omega \cdot j + \frac{R_{c3} \cdot (R_{c4} + L_{c3} \cdot \omega \cdot j)}{R_{c3} + R_{c4} + L_{c3} \cdot \omega \cdot j} \right)}{R_{c2} + L_{c2} \cdot \omega \cdot j + \frac{R_{c3} \cdot (R_{c4} + L_{c3} \cdot \omega \cdot j)}{R_{c3} + R_{c4} + L_{c3} \cdot \omega \cdot j}}} $$ #### 步骤1:公式结构分解 该公式表示一个三级级联的RLC网络: 1. **最内层**:$Z_3 = \frac{R_{c3} \cdot (R_{c4} + j\omega L_{c3})}{R_{c3} + R_{c4} + j\omega L_{c3}}$ - 这是并联的$R_{c3}$与$(R_{c4} + L_{c3})$组合 2. **中间层**:$Z_2 = \frac{R_{c2} \cdot (j\omega L_{c2} + Z_3)}{R_{c2} + j\omega L_{c2} + Z_3}$ - $R_{c2}$与$(L_{c2} + Z_3)$并联 3. **最外层**:$Z = \frac{R_{c1} \cdot (j\omega L_{c1} + Z_2)}{R_{c1} + j\omega L_{c1} + Z_2}$ - $R_{c1}$与$(L_{c1} + Z_2)$并联 #### 步骤2:MATLAB实现代码 ```matlab function Z = calc_impedance(omega, Rc1, Lc1, Rc2, Lc2, Rc3, Rc4, Lc3) j = 1i; % 虚数单位 % 最内层阻抗计算 Z3_num = Rc3 .* (Rc4 + Lc3.*omega.*j); Z3_den = Rc3 + Rc4 + Lc3.*omega.*j; Z3 = Z3_num ./ Z3_den; % 中间层阻抗计算 Z2_num = Rc2 .* (Lc2.*omega.*j + Z3); Z2_den = Rc2 + Lc2.*omega.*j + Z3; Z2 = Z2_num ./ Z2_den; % 最外层阻抗计算 Z_num = Rc1 .* (Lc1.*omega.*j + Z2); Z_den = Rc1 + Lc1.*omega.*j + Z2; Z = Z_num ./ Z_den; end ``` #### 步骤3:使用示例 ```matlab % 定义电路参数 Rc1 = 100; % Ohm Lc1 = 0.1; % H Rc2 = 200; % Ohm Lc2 = 0.05; % H Rc3 = 150; % Ohm Rc4 = 50; % Ohm Lc3 = 0.02; % H % 频率范围 (Hz) f = logspace(1, 6, 1000); % 10Hz到1MHz omega = 2*pi*f; % 角频率 % 计算阻抗 Z = calc_impedance(omega, Rc1, Lc1, Rc2, Lc2, Rc3, Rc4, Lc3); % 绘制结果 figure; subplot(2,1,1); loglog(f, abs(Z)); xlabel('频率 (Hz)'); ylabel('阻抗模值 |Z| (\Omega)'); grid on; subplot(2,1,2); semilogx(f, angle(Z)*180/pi); xlabel('频率 (Hz)'); ylabel('相位角 (度)'); grid on; ``` #### 步骤4:Python实现(使用NumPy) ```python import numpy as np import matplotlib.pyplot as plt def calc_impedance(omega, Rc1, Lc1, Rc2, Lc2, Rc3, Rc4, Lc3): j = 1j # 虚数单位 # 最内层阻抗计算 Z3_num = Rc3 * (Rc4 + Lc3 * omega * j) Z3_den = Rc3 + Rc4 + Lc3 * omega * j Z3 = Z3_num / Z3_den # 中间层阻抗计算 Z2_num = Rc2 * (Lc2 * omega * j + Z3) Z2_den = Rc2 + Lc2 * omega * j + Z3 Z2 = Z2_num / Z2_den # 最外层阻抗计算 Z_num = Rc1 * (Lc1 * omega * j + Z2) Z_den = Rc1 + Lc1 * omega * j + Z2 Z = Z_num / Z_den return Z # 使用示例 Rc1, Lc1 = 100, 0.1 Rc2, Lc2 = 200, 0.05 Rc3, Rc4, Lc3 = 150, 50, 0.02 f = np.logspace(1, 6, 1000) # 10Hz到1MHz omega = 2 * np.pi * f Z = calc_impedance(omega, Rc1, Lc1, Rc2, Lc2, Rc3, Rc4, Lc3) plt.figure(figsize=(10, 6)) plt.subplot(2, 1, 1) plt.loglog(f, np.abs(Z)) plt.xlabel('频率 (Hz)') plt.ylabel('阻抗模值 |Z| ($\Omega$)') plt.grid(True) plt.subplot(2, 1, 2) plt.semilogx(f, np.angle(Z) * 180 / np.pi) plt.xlabel('频率 (Hz)') plt.ylabel('相位角 (度)') plt.grid(True) plt.tight_layout() plt.show() ``` #### 关键注意事项: 1. **复数处理**:MATLAB和Python都原生支持复数运算,使用`1i`(MATLAB)或`1j`(Python) 2. **向量化计算**:代码使用`.*`(MATLAB)或`*`(Python)进行向量化运算,可高效处理频率数组 3. **频率范围**:使用对数间隔(`logspace`)能更好地展示电路频响特性 4. **结果可视化**:阻抗模值和相位角是分析电路特性的关键指标 #### 进阶应用: 1. **参数拟合**:使用`lsqnonlin`根据实测数据拟合电路参数 ```matlab % 定义误差函数 func = @(params) abs(calc_impedance(f_exp, params(1), params(2), ...)) - Z_measured; % 设置初始值和边界 x0 = [100, 0.1, 200, 0.05, 150, 50, 0.02]; lb = [0, 0, 0, 0, 0, 0, 0]; % 参数下限 ub = [1000, 1, 1000, 1, 1000, 1000, 1]; % 参数上限 % 执行拟合 [params_opt, resnorm] = lsqnonlin(func, x0, lb, ub); ``` 2. **结果导出**:将计算结果保存为CSV文件(参考您提供的函数)[^1] ```matlab function save_impedance_data(f, Z, filename) data = table(f(:), real(Z(:)), imag(Z(:)), abs(Z(:)), angle(Z(:)), ... 'VariableNames', {'Frequency', 'Real', 'Imag', 'Magnitude', 'Phase'}); writetable(data, filename); end ``` 此解析方法可推广到任意复杂度的RLC网络分析,通过分层计算简化处理过程[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值