You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含虚数单位'i'的拟合函数报错'object i not found'的解决方法

解决R语言复数拟合的错误与方法

1. 修复object 'i' not found错误

R语言中虚数单位是1i,而非你代码里的i,同时你的函数存在语法遗漏:W1(i*freq*W2)^-g缺少乘法运算符,需改为W1 * (1i*freq*W2)^-g。另外要把freq作为参数传入函数(它是数据中的变量,不能在函数内部直接引用)。修正后的拟合函数如下:

fitfunc <- function(R1, C1, R2, C2, W1, W2, g, freq) {
  R1 + (1i*freq*C1 + 1/R2)^-1 + (1i*freq*C2 + (W1 * (1i*freq*W2)^-g) * tanh((1i*freq*W2)^g)^-1)^-1
}

2. 处理复数数据的拟合问题

nls()默认仅支持实数响应变量,如果你的Z是复数类型,直接调用会报错,推荐两种解决方法:

方法一:拆分实部虚部,用optim()最小化残差平方和

将复数Z拆分为实部Re(Z)和虚部Im(Z),构造残差平方和的目标函数,通过optim()最小化该总和:

# 定义残差计算函数
residuals <- function(params, freq, Z) {
  R1 <- params[1]
  C1 <- params[2]
  R2 <- params[3]
  C2 <- params[4]
  W1 <- params[5]
  W2 <- params[6]
  g <- params[7]
  pred <- fitfunc(R1, C1, R2, C2, W1, W2, g, freq)
  # 计算实部+虚部的残差平方和
  sum((Re(pred) - Re(Z))^2 + (Im(pred) - Im(Z))^2)
}

# 设置初始参数
start_params <- c(R1=10, C1=1e-6, R2=10, C2=1e-6, W1=10, W2=10, g=0.5)

# 执行拟合
fit <- optim(start_params, residuals, freq=Zfreq$freq, Z=Zfreq$Z)

# 查看拟合得到的参数
fit$par

方法二:转换复数数据格式

如果你的Z是分开存储的实部和虚部列(比如Z_re和Z_im),可以合并为复数类型后再拟合:

Zfreq$Z <- with(Zfreq, Z_re + Z_im*1i)

3. 额外注意事项

  • 用is.complex(Zfreq$Z)检查Z是否为复数类型,若不是需先转换。
  • 初始参数尽量接近真实值,否则拟合可能出现不收敛的情况。

内容的提问来源于stack exchange,提问作者Kieran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:15:07