[已解决] 使用fminsearch时出现问题,从 sym 转换为 double 时出现以下错误: Unable to convert expression into double array.

[复制链接]
mwwww 发表于 2022-2-21 16:48:08
本帖最后由 mwwww 于 2022-2-21 17:14 编辑

新手小白,在用fminsearch时出现问题
  1. syms t S s z  ;
  2. assume(t > 0 );
  3. assume(S > 0 );
  4. assume(s > 0 );             %三个参数范围都是大于0
  5. c = 3*10^8  ;               %真空中的光速(m/s)
  6. K = 1.380649*10^-23 ;       %玻耳兹曼常数(j/k)
  7. T = 300 ;                   %室温(k)
  8. W = 280  ;                  %样品厚度(um)
  9. N_i = 1.5*10^17 ;           %本征载流子浓度
  10. N_A = 1.5*10^16  ;          %掺杂浓度(cm^-3)
  11. h   = 6.62607015*10^-34;    %普朗克常量(j.s)
  12. N_sic =  100 ;              %折射率
  13. R_f =  0 ;                  %前面反射率
  14. R_b =  0 ;                  %后面反射率
  15. Q   =  0.5 ;                %探测器的量子效率
  16. T_1 =  100 ;                %滤光器1的透射光谱
  17. T_2 =  110 ;                %滤光器2的透射光谱
  18. T_3 =  120 ;                %滤光器3的透射光谱

  19. F =   2*10^17    ;          %光通量(cm^2/s)
  20. D =   26.92    ;            %扩散系数(cm^2/s)

  21. lamda_1 =  910 ;            %激光器的波长(nm)
  22. a_1     =  272 ;            %吸收系数(cm^-1)
  23. lamda_2 =  930 ;            %发射波长(nm)
  24. a_2     =  210 ;            %碳化硅的吸收系数(cm^-1)

  25. Phi_2e   =  200;
  26. Phi_3e   =  250;
  27. Phi_4e   =  300;            %实验测得的PL强度

  28. L = (D*t)^0.5 ;   %扩散长度
  29. m = (S*L)/D;
  30. M = (s*L)/D;

  31. C_1 = -a_1*F*t/(a_1^2*D*t-1)*(-exp(W/L)*(m+a_1*L)*(M+1)+exp(-a_1*W)*(m-1)*(M-a_1*L))/(exp(W/L)*(m+1)*(M+1)-exp(-W/L)*(m-1)*(M-1));
  32. C_2 = -a_1*F*t/(a_1^2*D*t-1)*(-exp(-W/L)*(m+a_1*L)*(M-1)-exp(-a_1*W)*(m+1)*(M-a_1*L))/(exp(W/L)*(m+1)*(M+1)-exp(-W/L)*(m-1)*(M-1));
  33. n(z) = C_1*exp(-z/L)+C_2*exp(z/L)-a_1*F*t/(a_1^2*D*t-1)*exp(-a_1*z);    %载流子浓度

  34. f_e2(z) = (1-R_f) *(exp(-a_2*z)+R_b*exp(-a_2*(2*W-z)))/(1-R_f*R_b*exp(-2*a_2*W));%载流子逃逸率

  35. r_2 = (N_sic^2/N_i^2)*a_2*2*c/lamda_2^4*exp(-h*c/(lamda_2*K*T))*n(z)*N_A;      %载流子产生率

  36. Phi_2 =  r_2.*f_e2(z);
  37. B  = int(Phi_2,z,0,W);
  38. Phi_2d = Q*T_1*B; %考虑探测器的量子效率和滤光片通量后的pl
  39. Phi_3d = Q*T_2*B;
  40. Phi_4d = Q*T_3*B;
复制代码


到这都没有问题
  1. fun =@(t,S,s)(Phi_2d-Phi_2e).^2+(Phi_3d-Phi_3e).^2+(Phi_4d-Phi_4e).^2;
  2. V = @(x)fun(x(1),x(2),x(3));
  3. x0 = [0 0 0];
  4. [x,fval] = fminsearch(V,x0)
复制代码



运行fminsearch时出现问题,
从 sym 转换为 double 时出现以下错误:
Unable to convert expression into double array.

出错 fminsearch (line 200)
fv(:,1) = funfcn(x,varargin{:});


对matlab都不是太懂,都是看视频学着写的程序,请求大佬指教!








最佳答案


TouAkira 发表于 2022-2-21 21:40:56
简单讲,你前面 B  = int(Phi_2,z,0,W); 这样算出来是个符号表达式,于是后面接着的 Phi_2d  Phi_3d  Phi_4d 这些使用了 B 的变量,也是符号表达式。
对于这样的表达式,函数不能直接写成 fun =@(t,S,s) 符号表达式; 这样。要写成
  1. fun = (Phi_2d-Phi_2e).^2+(Phi_3d-Phi_3e).^2+(Phi_4d-Phi_4e).^2; % 不直接定义函数,先写出表达式
  2. fun = matlabFunction( fun, 'vars', [ t, S, s ] ) % 用matlabFunction将表达式转化为函数,这样才能正常计算数值
复制代码

另外你的初值给的也有问题,除非能确定代入后不会产生分母为零的情况,一般尽量用rand构造随机值来做初值。

3 条回复


mwwww 发表于 2022-2-21 17:25:33
前面的代码点复制代码到matlab里就显示错误使用 syms (line 222)Invalid variable name. 自己手动复制就是可以的,这又是什么问题啊。。。。

TouAkira 发表于 2022-2-21 21:40:56
简单讲,你前面 B  = int(Phi_2,z,0,W); 这样算出来是个符号表达式,于是后面接着的 Phi_2d  Phi_3d  Phi_4d 这些使用了 B 的变量,也是符号表达式。
对于这样的表达式,函数不能直接写成 fun =@(t,S,s) 符号表达式; 这样。要写成
  1. fun = (Phi_2d-Phi_2e).^2+(Phi_3d-Phi_3e).^2+(Phi_4d-Phi_4e).^2; % 不直接定义函数,先写出表达式
  2. fun = matlabFunction( fun, 'vars', [ t, S, s ] ) % 用matlabFunction将表达式转化为函数,这样才能正常计算数值
复制代码

另外你的初值给的也有问题,除非能确定代入后不会产生分母为零的情况,一般尽量用rand构造随机值来做初值。
回复此楼

mwwww 发表于 2022-2-22 10:13:17
TouAkira 发表于 2022-2-21 21:40
简单讲,你前面 B  = int(Phi_2,z,0,W); 这样算出来是个符号表达式,于是后面接着的 Phi_2d  Phi_3d  Phi_4 ...

非常感谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表