含虚数单位'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
相关产品推荐
相关产品推荐

