24小时热门版块排行榜    

查看: 3897  |  回复: 12

cs24451

铁虫 (初入文坛)

[求助] matlab使用自定义函数文件拟合出现错误 已有1人参与

代码如下,x,y是想要拟合的曲线对应的x,y值;L1,L2是想要拟合的参数;
下面就是一系列的矩阵计算,通过x求得y
使用ft=fittype('c(x,,L1,L2)');
出现错误:
错误使用 fittype/testCustomModelEvaluation (line 12)
Expression c(x,L1,L2) is not a valid MATLAB expression, has non-scalar coefficients, or cannot be evaluated:
Error in fittype expression ==> c(x,L1,L2)
??? 索引超出矩阵维度。
出错 fittype>iCreateFittype (line 371)
    testCustomModelEvaluation( obj );
出错 fittype (line 328)
                obj = iCreateFittype( obj, varargin{:} );
原因:
    错误使用 fittype/evaluate (line 102)
    Error in fittype expression ==> c(x,L1,L2)
    ??? 索引超出矩阵维度。
怎么解决这个问题?还有其他拟合办法吗?求助好心的坛友~~~~~~~~~~~~~~~~~~~

function [ y ] = c(x,L1,L2)
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
m=20; % number of section
n1 = 2.8924;   %AlAs
n2 = 3.3702;   %GaAS
na=1;
ns=n2;
ra=(na-n2)/(na+n2);
r=(n2-n1)/(n2+n1);
ta=sqrt(1-ra^2);
t=sqrt(1-r^2);
y=zeros(1,2500);
ab1=0;
ab2=0;
for kl=1:2500

    beta1 = 2*pi*n1/x(kl)-1i*ab1/2;
    beta2 = 2*pi*n2/x(kl)-1i*ab2/2;
   
    T11_a = exp(1i*beta2*L2)/ta;
    T12_a = ra*exp(-1i*beta2*L2)/ta;
    T21_a = ra*exp(1i*beta2*L2)/ta;
    T22_a = exp(-1i*beta2*L2)/ta;
    T=[T11_a,T12_a;T21_a,T22_a];
   
        for k=1:m-1
            T11_n2 = exp(1i*beta1*L1)/t;
            T12_n2 = r*exp(-1i*beta1*L1)/t;
            T21_n2 = r*exp(1i*beta1*L1)/t;
            T22_n2 = exp(-1i*beta1*L1)/t;
            T_n2=[T11_n2,T12_n2;T21_n2,T22_n2];
            T=T*T_n2;
            
            T11_n1 = exp(1i*beta2*L2)/t;
            T12_n1 = -r*exp(-1i*beta2*L2)/t;
            T21_n1 = -r*exp(1i*beta2*L2)/t;
            T22_n1 = exp(-1i*beta2*L2)/t;  
            T_n1=[T11_n1,T12_n1;T21_n1,T22_n1];
            T=T*T_n1;

        end
        T11_n2 = exp(1i*beta1*L1)/t;
        T12_n2 = r*exp(-1i*beta1*L1)/t;
        T21_n2 = r*exp(1i*beta1*L1)/t;
        T22_n2 = exp(-1i*beta1*L1)/t;
        T_n2=[T11_n2,T12_n2;T21_n2,T22_n2];
        T=T*T_n2;
        
        T_12=[1/t,-r/t;-r/t,1/t]; % from n1 to n2, just cross the interface
        T = T*T_12;
        
        T11_c = exp(1i*beta2*2*L2);
        T12_c = 0;
        T21_c = 0;
        T22_c = exp(-1i*beta2*2*L2);
        T_c = [T11_c,T12_c;T21_c,T22_c]; % n2 cavity
        T = T*T_c;
        
        for k=(1:m)
            T11_n2 = exp(1i*beta1*L1)/t;
            T12_n2 = r*exp(-1i*beta1*L1)/t;
            T21_n2 = r*exp(1i*beta1*L1)/t;
            T22_n2 = exp(-1i*beta1*L1)/t;
            T_n2=[T11_n2,T12_n2;T21_n2,T22_n2];
            T=T*T_n2;
            T11_n1 = exp(1i*beta2*L2)/t;
            T12_n1 = -r*exp(-1i*beta2*L2)/t;
            T21_n1 = -r*exp(1i*beta2*L2)/t;
            T22_n1 = exp(-1i*beta2*L2)/t;  
            T_n1=[T11_n1,T12_n1;T21_n1,T22_n1];
            T=T*T_n1;
        end   
        

        T11_n2 = exp(1i*beta1*L1)/t;
        T12_n2 = r*exp(-1i*beta1*L1)/t;
        T21_n2 = r*exp(1i*beta1*L1)/t;
        T22_n2 = exp(-1i*beta1*L1)/t;
        T_n2=[T11_n2,T12_n2;T21_n2,T22_n2];
        T=T*T_n2;
        
        T_12=[1/t,-r/t;-r/t,1/t];
        T = T*T_12;
        
        T11_c = exp(1i*beta2*9*L2);
        T12_c = 0;
        T21_c = 0;
        T22_c = exp(-1i*beta2*9*L2);
        T_c = [T11_c,T12_c;T21_c,T22_c]; % n2 cavity
        T = T*T_c;
        
        T11_n2 = exp(1i*beta1*L1)/t;
        T12_n2 = r*exp(-1i*beta1*L1)/t;
        T21_n2 = r*exp(1i*beta1*L1)/t;
        T22_n2 = exp(-1i*beta1*L1)/t;
        T_n2=[T11_n2,T12_n2;T21_n2,T22_n2];
        T=T*T_n2;
        
        rs1=(n1-ns)/(ns+n1);
        ts1=sqrt(1-rs1^2);
        T11_s = 1/ts1;  % n1 to substrate
        T12_s = rs1/ts1;
        T21_s = rs1/ts1;
        T22_s = 1/ts1;
        T_s = [T11_s,T12_s;T21_s,T22_s];
        T=T*T_s;
        y(kl) = (abs(T(2,1)/T(1,1)))^2;
end

end
回复此楼

» 收录本帖的淘帖专辑推荐

学习方法

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

512095518

专家顾问 (正式写手)

【答案】应助回帖

感谢参与,应助指数 +1
你先给出你的拟合数据,x,y,然后给出你估计的L1 L2的值
你的这个函数function [ y ] = c(x,L1,L2),是表示用x,L1,L2就可以计算出y值对吧
没有极限,只有超越!
2楼2016-08-31 19:11:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cs24451

铁虫 (初入文坛)

引用回帖:
2楼: Originally posted by 512095518 at 2016-08-31 19:11:07
你先给出你的拟合数据,x,y,然后给出你估计的L1 L2的值
你的这个函数function  = c(x,L1,L2),是表示用x,L1,L2就可以计算出y值对吧

是的 ,我已经设置了x,y值, 想通过我的函数c(x,L1,L2)来求得合适的L1与L2值
3楼2016-08-31 23:37:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

512095518

专家顾问 (正式写手)

【答案】应助回帖

引用回帖:
3楼: Originally posted by cs24451 at 2016-08-31 23:37:42
是的 ,我已经设置了x,y值, 想通过我的函数c(x,L1,L2)来求得合适的L1与L2值...

我想帮你,就必须只要你的x,y数值,还有待定的L1 L2,然后我再尝试看看怎么编写代码
没有极限,只有超越!
4楼2016-08-31 23:48:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cs24451

铁虫 (初入文坛)

引用回帖:
4楼: Originally posted by 512095518 at 2016-08-31 23:48:58
我想帮你,就必须只要你的x,y数值,还有待定的L1 L2,然后我再尝试看看怎么编写代码...

我把想x,y L1 L2的值都写在excel里面了

多谢!!!!

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : 参数.xlsx
  • 2016-09-01 00:44:54, 69.71 K
5楼2016-09-01 00:45:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

512095518

专家顾问 (正式写手)

【答案】应助回帖

引用回帖:
5楼: Originally posted by cs24451 at 2016-09-01 00:45:30
我把想x,y L1 L2的值都写在excel里面了

多谢!!!!...

L1 = -9.02438565124979e-09
L2 = -8.31832684073256e-09
你验证下对不对
没有极限,只有超越!
6楼2016-09-01 13:31:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cs24451

铁虫 (初入文坛)

引用回帖:
6楼: Originally posted by 512095518 at 2016-09-01 13:31:34
L1 = -9.02438565124979e-09
L2 = -8.31832684073256e-09
你验证下对不对...

额  楼主怎么实现的  能说下么  我这个L1 L2代表长度, 希望在我给出的值附近浮动,不能为负。。。
7楼2016-09-01 16:13:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

512095518

专家顾问 (正式写手)

【答案】应助回帖

引用回帖:
7楼: Originally posted by cs24451 at 2016-09-01 16:13:49
额  楼主怎么实现的  能说下么  我这个L1 L2代表长度, 希望在我给出的值附近浮动,不能为负。。。...

正数也一样,把负号去了就行,代码如下,我是MATLAB R2016a
CODE:
function F = myfun(b)
data = load('a.txt');
x = data(:,1); yn = data(:,2);
m=20; % number of section
n1 = 2.8924;   %AlAs
n2 = 3.3702;   %GaAS
na=1;
ns=n2;
ra=(na-n2)/(na+n2);
r=(n2-n1)/(n2+n1);
ta=sqrt(1-ra^2);
t=sqrt(1-r^2);
y=zeros(1,2500);
ab1=0;
ab2=0;
for kl=1:2500

    beta1 = 2*pi*n1/x(kl)-1i*ab1/2;
    beta2 = 2*pi*n2/x(kl)-1i*ab2/2;
   
    T11_a = exp(1i*beta2*b(2))/ta;
    T12_a = ra*exp(-1i*beta2*b(2))/ta;
    T21_a = ra*exp(1i*beta2*b(2))/ta;
    T22_a = exp(-1i*beta2*b(2))/ta;
    T=[T11_a,T12_a;T21_a,T22_a];
   
        for k=1:m-1
            T11_n2 = exp(1i*beta1*b(1))/t;
            T12_n2 = r*exp(-1i*beta1*b(1))/t;
            T21_n2 = r*exp(1i*beta1*b(1))/t;
            T22_n2 = exp(-1i*beta1*b(1))/t;
            T_n2=[T11_n2,T12_n2;T21_n2,T22_n2];
            T=T*T_n2;
            
            T11_n1 = exp(1i*beta2*b(2))/t;
            T12_n1 = -r*exp(-1i*beta2*b(2))/t;
            T21_n1 = -r*exp(1i*beta2*b(2))/t;
            T22_n1 = exp(-1i*beta2*b(2))/t;  
            T_n1=[T11_n1,T12_n1;T21_n1,T22_n1];
            T=T*T_n1;

        end
        T11_n2 = exp(1i*beta1*b(1))/t;
        T12_n2 = r*exp(-1i*beta1*b(1))/t;
        T21_n2 = r*exp(1i*beta1*b(1))/t;
        T22_n2 = exp(-1i*beta1*b(1))/t;
        T_n2=[T11_n2,T12_n2;T21_n2,T22_n2];
        T=T*T_n2;
        
        T_12=[1/t,-r/t;-r/t,1/t]; % from n1 to n2, just cross the interface
        T = T*T_12;
        
        T11_c = exp(1i*beta2*2*b(2));
        T12_c = 0;
        T21_c = 0;
        T22_c = exp(-1i*beta2*2*b(2));
        T_c = [T11_c,T12_c;T21_c,T22_c]; % n2 cavity
        T = T*T_c;
        
        for k=(1:m)
            T11_n2 = exp(1i*beta1*b(1))/t;
            T12_n2 = r*exp(-1i*beta1*b(1))/t;
            T21_n2 = r*exp(1i*beta1*b(1))/t;
            T22_n2 = exp(-1i*beta1*b(1))/t;
            T_n2=[T11_n2,T12_n2;T21_n2,T22_n2];
            T=T*T_n2;
            T11_n1 = exp(1i*beta2*b(2))/t;
            T12_n1 = -r*exp(-1i*beta2*b(2))/t;
            T21_n1 = -r*exp(1i*beta2*b(2))/t;
            T22_n1 = exp(-1i*beta2*b(2))/t;  
            T_n1=[T11_n1,T12_n1;T21_n1,T22_n1];
            T=T*T_n1;
        end   
        

        T11_n2 = exp(1i*beta1*b(1))/t;
        T12_n2 = r*exp(-1i*beta1*b(1))/t;
        T21_n2 = r*exp(1i*beta1*b(1))/t;
        T22_n2 = exp(-1i*beta1*b(1))/t;
        T_n2=[T11_n2,T12_n2;T21_n2,T22_n2];
        T=T*T_n2;
        
        T_12=[1/t,-r/t;-r/t,1/t];
        T = T*T_12;
        
        T11_c = exp(1i*beta2*9*b(2));
        T12_c = 0;
        T21_c = 0;
        T22_c = exp(-1i*beta2*9*b(2));
        T_c = [T11_c,T12_c;T21_c,T22_c]; % n2 cavity
        T = T*T_c;
        
        T11_n2 = exp(1i*beta1*b(1))/t;
        T12_n2 = r*exp(-1i*beta1*b(1))/t;
        T21_n2 = r*exp(1i*beta1*b(1))/t;
        T22_n2 = exp(-1i*beta1*b(1))/t;
        T_n2=[T11_n2,T12_n2;T21_n2,T22_n2];
        T=T*T_n2;
        
        rs1=(n1-ns)/(ns+n1);
        ts1=sqrt(1-rs1^2);
        T11_s = 1/ts1;  % n1 to substrate
        T12_s = rs1/ts1;
        T21_s = rs1/ts1;
        T22_s = 1/ts1;
        T_s = [T11_s,T12_s;T21_s,T22_s];
        T=T*T_s;
        y(kl) = (abs(T(2,1)/T(1,1)))^2;
end
F = y'-yn;

CODE:
b0 = [-0.5e-9,-0.5e-9];
options = optimoptions(@lsqnonlin,'TolFun',1e-20,'TolX',1e-20,...
    'Algorithm','levenberg-marquardt','Plotfcns',@optimplotfval,...
    'OptimalityTolerance',1e20,'MaxIterations',1500,...
    'Display', 'iter-detailed','MaxFunctionEvaluations',2000);
K2 = lsqnonlin(@myfun,b0,[],[],options);

没有极限,只有超越!
8楼2016-09-01 21:20:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cs24451

铁虫 (初入文坛)

引用回帖:
8楼: Originally posted by 512095518 at 2016-09-01 21:20:02
正数也一样,把负号去了就行,代码如下,我是MATLAB R2016a
function F = myfun(b)
data = load('a.txt');
x = data(:,1); yn = data(:,2);
m=20; % number of section
n1 = 2.8924;   %AlAs
n2 = 3.3702;   ...

我带入了一下  不太对啊  这是我想要拟合的曲线
matlab使用自定义函数文件拟合出现错误
untitled.jpg

9楼2016-09-02 01:04:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cs24451

铁虫 (初入文坛)

引用回帖:
8楼: Originally posted by 512095518 at 2016-09-01 21:20:02
正数也一样,把负号去了就行,代码如下,我是MATLAB R2016a
function F = myfun(b)
data = load('a.txt');
x = data(:,1); yn = data(:,2);
m=20; % number of section
n1 = 2.8924;   %AlAs
n2 = 3.3702;   ...

这是我原有的L1 L2带入之后的曲线
matlab使用自定义函数文件拟合出现错误-1
111.jpg

10楼2016-09-02 01:08:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 cs24451 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 基金系统什么内容也没有 30+3 winsaint 2026-08-27 7/350 2026-08-28 07:06 by hejicker
[基金申请] 投票:  有多少人是今天查系统知道结果的? +16 爱看书的可乐 2026-08-26 18/900 2026-08-28 05:13 by winsaint
[硕博家园] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +3 XLGfUIdOmEAO 2026-08-27 3/150 2026-08-28 00:49 by 3RAFyYXYSwGS
[基金申请] 哪位高人中了,把查询到的截图贴出来让我看看,让我长长见识 +5 yuleib84 2026-08-26 6/300 2026-08-28 00:02 by yudaoqian88
[教师之家] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +3 XLGfUIdOmEAO 2026-08-27 4/200 2026-08-27 22:26 by 3RAFyYXYSwGS
[基金申请] 面上合作单位盖章 +5 ssyjh 2026-08-27 5/250 2026-08-27 20:50 by gdfollow
[基金申请] 申请删除本帖 +6 lyz123lyz 2026-08-27 7/350 2026-08-27 17:31 by 宁静致远sy
[基金申请] 看板上这么多中的,有点像50人群里49个人都是骗子的那种感觉…… +5 a089 2026-08-26 6/300 2026-08-27 14:05 by jonewore
[教师之家] 售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急 +3 LIbGuocjEEYw 2026-08-26 4/200 2026-08-27 04:33 by Ie9AyIAvGbvs
[基金申请] 我不理解! +15 Edward_pc 2026-08-26 23/1150 2026-08-26 20:34 by zzuzxg
[基金申请] 系统查不到 +10 董八千 2026-08-26 10/500 2026-08-26 16:30 by Equinoxhua
[基金申请] 怎么查啊 +5 huang1991js 2026-08-26 5/250 2026-08-26 16:09 by Equinoxhua
[基金申请] 能否退出参与的面上项目解除限项 +23 koalala 2026-08-24 26/1300 2026-08-26 14:29 by 宝贝虫子
[基金申请] 今天务委会开完了,明天出结果吗 +19 angus9576 2026-08-25 23/1150 2026-08-26 10:03 by zp519
[基金申请] 牛来!米来!面来! +8 beefly 2026-08-26 8/400 2026-08-26 08:37 by xuzhipiao
[基金申请] 明天应该可查了!? +6 chengyan1220 2026-08-23 6/300 2026-08-25 19:45 by zfd97
[基金申请] 人气不行了 +11 fansofjerry 2026-08-21 11/550 2026-08-25 11:04 by 孤独的英雄6
[教师之家] 跳槽后在研项目怎么办? +5 简单化xn 2026-08-22 10/500 2026-08-23 12:38 by 简单化xn
[基金申请] 看来今天不会放榜了? +8 chengyan1220 2026-08-21 11/550 2026-08-21 17:52 by dcqxinyang
[基金申请] 应该是下周三26日公布了吧? +4 哈哈蛤? 2026-08-21 4/200 2026-08-21 10:58 by Vivilian
信息提示
请填处理意见