精华内容
下载资源
问答
  • 使用“regress” 线性的不行,用二次函数。 format long A=[... 0.2 13.6 8503 251 27.4 7.7 9.9 3658 314 13.9 5.8 10.8 7307 433 26.8 7.70 9.70 6717 257 23.8 7.5 9.8 7609 280 21.7 ...

    辛苦几天收集的资料:

    1.使用“nlinfit”

    x1=1150,1000,900,850,700,625,550,475,3350,3500,5900,5800,5700,4600,4625,4725,11650,11200,11200]';

    x2=[175,100,25,0,75,100,150,200,50,600,500,225,100,1225,1600,2000,1200,1000,1550

    ]';

    x=[x1,x2];

    y=[1.44E-02,1.80E-02,6.08E-02,5.59E-02,3.42E-02,7.74E-03,1.17E-03,6.16E-03,1.91E-04,1.91E-04,1.02E-03,2.83E-03,9.52E-05,3.77E-04,2.70E-04,1.87E-04,3.98E-04,4.04E-04,4.02E-04]';

    beta0=[0.1 0.1 1 1];

    myfun=@(a,x)4030.0./pi./4.2./(a(1).*x(:,1).^a(2).*a(3).*x(:,1).^a(4)).*exp(-(x(:,2).^2./2./(a(1).*x(:,1).^a(2)).^2+30.0.^2./2./(a(3).*x(:,1).^a(4)).^2));

    [a,b,c,d,res]=nlinfit(x,y,myfun,beta0);a,res

    plot3(x1,x2,y,'o',x1,x2,myfun(a,x))

    值的选取没有定法,与实际问题的模型有关。

    2.使用“regress”

    线性的不行,用二次函数。

    format long

    A=[...

    0.2 13.6 8503 251 27.4 7.7 9.9 3658 314 13.9 5.8 10.8 7307 433 26.8 7.70 9.70 6717 257 23.8 7.5 9.8 7609 280 21.7 5.6 11.3 4271 533 14.6 6.2 7.6 52169 48 225 3.23 9.16 16516 80 44.1 0.33 11.3 17366 85 54.1 0.14 9.5 14245 91 56.6 5.5 9.7 18184 3 31.6 2.3 8.9 33612 250 114.9 3.3 4.6 73927 5 166 1.9 9.7 32175 150 107.5 0.6 9.9 33088 242 142.3 0.22 11.7 18620 567 60.4 1.88 11.76 27885 267 71.6 2.78 10.9 21780 76 58.7]

    x=A(:,1:4),Y=A(:,5)

    x11=x(:,1).*x(:,1);

    x12=x(:,1).*x(:,2);

    x13=x(:,1).*x(:,3);

    x14=x(:,1).*x(:,4);

    x22=x(:,2).*x(:,2);

    x23=x(:,2).*x(:,3);

    x24=x(:,2).*x(:,4);

    x33=x(:,3).*x(:,3);

    x34=x(:,3).*x(:,4);

    x44=x(:,4).*x(:,4);

    X=[x(:,:),x11,x12,x13,x14,x22,x23,x24,x33,x34,x44]

    [B,BINT,R] = REGRESS(Y,[ones(length(Y),1),X]) 结果:

    B =

    1.0e+003 *

    -1.426098928217992

    -0.004076772421011

    0.255534919787513

    0.000012942581436

    0.000845938681439

    0.000607150442496

    -0.000574488595437

    0.000000405451807

    -0.000042626483419

    -0.011775830339062

    -0.000000876232149

    0.000008150156703

    -0.000000000013441

    -0.000000013991054

    -0.000000969496753

    R =

    3.122573422039807

    0.447341267999400

    -7.343326306615449

    2.107836742251767

    -6.239492394117182

    9.044235126157025

    2.238791755625499

    4.285551199892858

    -2.231536057549363

    -1.979307925154075

    3.503835830046878

    1.414933242530537

    -1.426757776398972

    -12.052007973319576

    14.597045597468522

    -5.024612350970848

    -1.747668123505179

    -2.717435276394376

    B就是系数,R就是预测值与实际值的差值。

    3. 使用“lsqcurvefit”

    clear

    clc

    x=[40 50 60 70 80 90 100 110 120 135 150];

    y=[0.0096 0.0145 0.0194 0.0348 0.0501 0.0751 0.1000 0.1497 0.1993 0.2496 0.2999];

    z=[0.2400 0.2865 0.3330 0.3600 0.3870 0.4010 0.4150 0.4390 0.4630 0.4875 0.5120];

    X0=[1 1 1 1 1 1];

    %只要这样写就可以了

    f=@(p,x)( p(1) + p(2)*x(1,:) +

    p(3)*x(2,:) + p(4)*x(1,:).^2 + p(5)*x(1,:).*x(2,:) +

    p(6)*x(2,:).^2);

    p=lsqcurvefit(f,X0,[x;y],z)

    展开全文
  • % 使用最小二乘拟合: % opt指定拟合选项(注意查看命令窗口提示的优化终止条件,如对结果不满意考虑适当修改) % b0为初值(要慎重选择,不同初值得到的结果可能不同) opt = optimset('MaxFunEvals',50000,'MaxIter',...

    名流

    幼苗

    共回答了17个问题采纳率:100%

    function zd487022570

    x1=[0.25,0.278,0.3125,0.357,0.4167,0.3,0.3333,0.375,0.7286,0.5];

    x2=[0,0.1111,0.125,0.14286,0.1667,0,0.1111,0.125,0.14286,0.1667];

    x3=[0,0,0.125,0.2857,0.5,0,0,0.125,0.2857,0.5];

    y=[0.7572,0.6559,0.6383,0.5636,0.4884,0.9783,0.7489,0.686,0.6288,0.4934];

    x = [x1; x2; x3];

    % 使用最小二乘拟合:

    % opt指定拟合选项(注意查看命令窗口提示的优化终止条件,如对结果不满意考虑适当修改)

    % b0为初值(要慎重选择,不同初值得到的结果可能不同)

    opt = optimset('MaxFunEvals',50000,'MaxIter',10000,'TolFun',1E-10)

    % b0 = [0 -10 1 1];

    % b0 = [0.6 -60 15 0.7];

    b0 = [0.7 -137 40 0.7];

    b = lsqcurvefit(@myfun,b0,x,y,[],[],opt);

    A = b(1)

    B = b(2)

    C = b(3)

    D = b(4)

    % 把拟合结果与原始数据对照

    plot(y,'-o');

    hold on

    plot(myfun(b,x),'r:x');

    function y = myfun(x,xdata)

    A = x(1);

    B = x(2);

    C = x(3);

    D = x(4);

    x1 = xdata(1,:);

    x2 = xdata(2,:);

    x3 = xdata(3,:);

    y = A*x1./(1+B*x2+C*x3)+D;

    1年前

    追问

    10

    4591900211

    运行报错了 ??? function zd487022570 | Error: Function definitions are not permitted in this context. 看不懂function zd487022570这是什么意思……

    4591900211

    你是不是文件里还加了别的东西? 把我上面贴的代码直接贴到新建的文件中,然后保存就行,不可能有错。我在6.5和R2007b两个版本上测试过。 最上面的“function zd487022570”是因为调用lsqcurvefit需要把拟合公式写成函数,而这种问题用inline函数或匿名函数都不太方便,所以使用了function。而在一个文件中如果有function就不能是script,所以就把前面的代码取个名字也成为一个function。函数的名字就用的是你提问这个网页的号码加了两个字母的前缀,当然,你可以把它改成其他任何合法的标识符。

    展开全文
  • 看文章说可以用最小二乘法算,使得拟合值和实验值的差值的平方和最小,但是我自己有不太懂matlab,所以就弄了很长时间,期望有大神能够帮帮忙,同时,告诉我该如何算出拟合的R2以及拟合值与实验值的偏差之类的,...

    求帮帮忙

    我想要算动力学参数的,有这样一组数据

    y=k*exp(-E/(8*X1))*(1-X2)*(1-alog(1-X2))^0.5

    我的数据如下

    X1=

    [868

    869

    870

    871

    872

    873

    874

    875

    876

    877

    878

    879

    880

    881

    882

    883

    884

    885

    886

    887

    888

    889

    890

    891

    892

    893

    894

    895

    896

    897

    898

    899

    900

    901

    902

    903

    904

    905

    906

    907

    908

    909

    910

    911

    912

    913

    914

    915

    916

    917

    918

    919

    920

    921

    922

    923

    924

    925

    926

    927

    928

    929

    930

    931

    932

    933

    934

    935

    936

    937

    938

    939

    940

    941

    942

    943

    944

    945

    946

    947

    948

    949

    950

    951

    952

    953

    954

    955

    956

    957

    958

    959

    960

    961

    962

    963

    964

    965

    966

    967

    968

    969

    970

    971

    972

    973

    974

    975

    976

    977

    978

    979

    980

    981

    982

    983

    984

    985

    986

    987

    988

    989

    990

    991

    992

    993

    994

    995

    996

    997

    998

    999

    1000

    1001

    1002

    1003

    1004

    1005

    1006

    1007

    1008

    1009

    1010

    1011

    1012

    1013

    1014

    1015

    1016

    1017

    1018

    1019

    1020

    1021

    1022

    1023

    1024

    1025

    1026

    1027

    1028

    1029

    1030

    1031

    1032

    1033

    1034

    1035

    1036

    1037

    1038

    1039

    1040

    1041

    1042

    1043

    1044

    1045

    1046

    1047

    1048

    1049

    1050

    1051

    1052

    1053

    1054

    1055

    1056

    1057

    1058

    1059

    1060

    1061

    1062

    1063

    1064

    1065

    ]

    X2=[0.04889

    0.05027

    0.05164

    0.05306

    0.05445

    0.05592

    0.05746

    0.05901

    0.06055

    0.06224

    0.06381

    0.06554

    0.06724

    0.06905

    0.07087

    0.07271

    0.07458

    0.07649

    0.07851

    0.08051

    0.08263

    0.08467

    0.08686

    0.08898

    0.09122

    0.09346

    0.09581

    0.09823

    0.10057

    0.1031

    0.10554

    0.1081

    0.11068

    0.11336

    0.11595

    0.1188

    0.12158

    0.12436

    0.12716

    0.13005

    0.1329

    0.13597

    0.13899

    0.14206

    0.14505

    0.14829

    0.15137

    0.15461

    0.1578

    0.16101

    0.16431

    0.16765

    0.17103

    0.1745

    0.17794

    0.1815

    0.18496

    0.1884

    0.192

    0.1956

    0.19914

    0.20283

    0.2065

    0.21015

    0.2139

    0.21757

    0.22131

    0.22502

    0.22879

    0.23248

    0.2361

    0.23993

    0.24386

    0.24761

    0.25162

    0.25529

    0.25918

    0.26314

    0.26716

    0.27091

    0.27478

    0.27887

    0.28278

    0.28673

    0.29096

    0.29512

    0.2994

    0.30354

    0.30793

    0.31205

    0.31651

    0.32088

    0.32528

    0.32952

    0.33411

    0.33881

    0.34353

    0.34817

    0.35289

    0.35763

    0.36234

    0.36721

    0.37209

    0.37701

    0.38209

    0.38703

    0.39254

    0.39774

    0.40286

    0.40849

    0.41413

    0.41949

    0.42511

    0.43068

    0.43681

    0.44246

    0.44839

    0.45441

    0.46054

    0.46659

    0.47288

    0.47911

    0.48554

    0.49185

    0.49801

    0.50477

    0.51132

    0.51815

    0.52497

    0.53155

    0.53862

    0.5454

    0.55284

    0.55967

    0.56658

    0.57388

    0.58123

    0.58829

    0.59611

    0.60318

    0.61061

    0.6181

    0.62569

    0.63321

    0.64052

    0.64801

    0.65556

    0.66292

    0.67052

    0.67808

    0.68584

    0.69305

    0.70107

    0.70835

    0.71618

    0.72377

    0.7308

    0.73865

    0.74545

    0.75326

    0.76039

    0.76776

    0.77499

    0.78207

    0.78929

    0.79605

    0.80346

    0.8099

    0.81658

    0.82302

    0.82975

    0.83618

    0.84261

    0.84874

    0.85502

    0.86079

    0.86645

    0.87237

    0.87796

    0.88343

    0.88867

    0.89387

    0.89894

    0.90384

    0.90856

    0.9132

    0.91768

    0.92216

    0.92615

    0.93023

    0.93409

    0.93778

    0.94141

    0.94479

    0.94812

    0.95115

    0.95411

    0.957]

    Y=[0.01264

    0.01291

    0.0132

    0.0135

    0.01382

    0.01415

    0.01451

    0.01487

    0.01523

    0.01562

    0.01597

    0.01636

    0.01673

    0.01713

    0.01751

    0.01789

    0.01827

    0.01865

    0.01905

    0.01944

    0.01984

    0.02022

    0.02063

    0.02102

    0.02143

    0.02185

    0.0223

    0.02276

    0.0232

    0.02365

    0.02408

    0.0245

    0.02491

    0.02533

    0.02573

    0.02616

    0.02657

    0.02696

    0.02736

    0.02775

    0.02812

    0.02851

    0.02888

    0.02925

    0.02959

    0.02995

    0.03027

    0.0306

    0.0309

    0.03119

    0.03148

    0.03176

    0.03203

    0.0323

    0.03257

    0.03284

    0.03308

    0.03332

    0.03356

    0.03378

    0.03399

    0.0342

    0.03439

    0.03457

    0.03475

    0.03493

    0.0351

    0.03526

    0.03543

    0.0356

    0.03576

    0.03594

    0.03613

    0.03631

    0.03651

    0.03669

    0.0369

    0.03713

    0.03738

    0.03762

    0.0379

    0.0382

    0.03851

    0.03885

    0.03921

    0.03958

    0.03996

    0.04034

    0.04073

    0.04112

    0.04155

    0.04198

    0.04243

    0.04288

    0.04337

    0.04388

    0.04441

    0.04494

    0.04548

    0.04604

    0.04659

    0.04716

    0.04773

    0.04831

    0.04891

    0.04951

    0.05018

    0.05082

    0.05145

    0.05216

    0.05286

    0.05352

    0.05421

    0.05489

    0.05562

    0.05628

    0.05696

    0.05764

    0.05831

    0.05897

    0.05965

    0.06031

    0.06098

    0.06163

    0.06225

    0.06292

    0.06355

    0.0642

    0.06482

    0.06539

    0.06597

    0.06651

    0.06707

    0.06757

    0.06807

    0.0686

    0.0691

    0.06955

    0.07

    0.07036

    0.07069

    0.07097

    0.07117

    0.07129

    0.07135

    0.07138

    0.07145

    0.07159

    0.07181

    0.07203

    0.07222

    0.07232

    0.07229

    0.07215

    0.0719

    0.07159

    0.07125

    0.07082

    0.07041

    0.0699

    0.06939

    0.06882

    0.0682

    0.06755

    0.06682

    0.06609

    0.06522

    0.06441

    0.06351

    0.06258

    0.06156

    0.06053

    0.05945

    0.05838

    0.05723

    0.05612

    0.05499

    0.05375

    0.05252

    0.05125

    0.04998

    0.04867

    0.04734

    0.04599

    0.04463

    0.04323

    0.0418

    0.04031

    0.03892

    0.03745

    0.03602

    0.03462

    0.03319

    0.03182

    0.0304

    0.02904

    0.02766

    0.02625

    ];

    看文章说可以用最小二乘法算,使得拟合值和实验值的差值的平方和最小,但是我自己有不太懂matlab,所以就弄了很长时间,期望有大神能够帮帮忙,同时,告诉我该如何算出拟合的R2以及拟合值与实验值的偏差之类的,多谢多谢了!!!!!

    展开全文
  • 利用matlab实现非线性拟合0 前言1 线性拟合1.1 多项式拟合1.2 线性拟合2 一维非线性拟合2.1 简单的非线性拟合2.2 matlab中Curve Fitting App2.3 matlab非线性拟合的实现2.3.1 fit()函数2.3.2 nlinfit()函数2.3.3 ...

    2021.06 更新。补充了非线性拟合中,关于最小二乘定义的问题,放在了最后一章。

    本文首发于 matlab爱好者 微信公众号,欢迎关注。

    惯例声明:本人没有相关的工程应用经验,只是纯粹对相关算法感兴趣才写此博客。所以如果有错误,欢迎在评论区指正,不胜感激。本文主要关注于算法的实现,对于实际应用等问题本人没有任何经验,所以也不再涉及。

    本人在学习matlab匿名函数时,作为练习有感而发,写下下面内容,非专业,难免有误。
    在这里插入图片描述

    0 前言

    一般而言,通过已有的数据点去推导其它数据点,常见的方法有插值和拟合。插值适用性较广,尤其是线性插值或样条插值已被广泛的应用。但是通过已知的函数去拟合数据,是连接理论与实验重要的桥梁,这一点是插值无法替代的。

    日常学习工作中,经常会遇到下面这种问题:想要用某个具体函数去拟合自己的数据,明明知道这个函数的具体形式,却不知道其中的参数怎么选取。本文就简单介绍一下matlab环境下,如何进行非线性拟合。

    1 线性拟合

    1.1 多项式拟合

    多项式拟合就是利用下面形式的方程去拟合数据:
    y = a + b x + c x 2 + d x 3 + . . . y=a +bx+cx^2+dx^3+... y=a+bx+cx2+dx3+...
    matlab中可以用polyfit()函数进行多项式拟合。下面举一个小例子:

    对于已有的数据点,我们采用4阶多项式拟合。其中已知函数的的表达式为

    y=0.03 x^4 - 0.5 x^3 + 2 x^2 - 4
    

    在此基础上添加了一些噪声点。拟合曲线依然采用4阶进行拟合,结果如下。

    在这里插入图片描述
    可以看到拟合曲线与理论曲线基本一致,说明这种方法能够较好的拟合出原始数据的趋势。源代码如下:

    x=0:0.5:10;
    y=0.03*x.^4-0.5*x.^3+2.0*x.^2-0*x-4+6*(rand(size(x))-0.5);
    p=polyfit(x,y,4);
    x2=0:0.05:10;
    y2=polyval(p,x2);
    figure();
    subplot(1,2,1)
    hold on
    plot(x,y,'linewidth',1.5,'MarkerSize',15,'Marker','.','color','k')
    plot(x,0.03*x.^4-0.5*x.^3+2.0*x.^2-0*x-4,'linewidth',1,'color','b')
    hold off
    legend('原始数据点','理论曲线','Location','southoutside','Orientation','horizontal')
    legend('boxoff')
    box on
    subplot(1,2,2)
    hold on
    plot(x2,y2,'-','linewidth',1.5,'color','r')
    plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
    hold off
    box on
    legend('拟合曲线','数据点','Location','southoutside','Orientation','horizontal')
    legend('boxoff')
    

    对于多项式拟合,不是阶数越多越好。比如还是这个上面这个例子,阶数越多,曲线越能够穿过每一个点,但是曲线的形状与理论曲线偏离越大。所以选择最适合的才是最好的。
    在这里插入图片描述

    1.2 线性拟合

    线性拟合就是能够把拟合函数写成下面这种形式的:
    y = p 1 f 1 ( x ) + p 2 f 2 ( x ) + p 3 f 3 ( x ) + . . . y=p_1 f_1(x) +p_2 f_2(x)+p_3 f_{3}(x)+... y=p1f1(x)+p2f2(x)+p3f3(x)+...

    其中f(x)是关于x的函数,其表达式是已知的。p是常数系数,这个是未知的。

    对于这种形式的拟合,matlab内部有一个及其强悍的函数,可以自动输出p的解,并且满足最小二乘。这个函数就是\。没错,就是斜杠。这个符号通常用于求解方程AX=B的情况,我们用X=A\B可以求出未知数X。我们利用当A行和列不等时,输出X的最小二乘这个特性,就可以求出相应的最佳拟合。

    还是举个例子

    在这里插入图片描述
    虽然看上去很非线性,但是x和y都是已知的,a、b、c是未知的,而且是线性的,所以可以被非常简单的拟合出来。假设a=2.5,b=0.5,c=-1,加入随机扰动。拟合的最终效果为:

    在这里插入图片描述
    最终得到的拟合参数为:a=2.47,b=0.47,c=-0.66。考虑到随机噪声的影响,与原始数据相差不大,源代码如下:

    %线性拟合
    x=0:0.5:10;
    a=2.5;
    b=0.5;
    c=-1;
    %原函数
    y=a*sin(0.2*x.^2+x)+b*sqrt(x+1)+c+0.5*rand(size(x));
    
    %拟合部分
    yn1=sin(0.2*x.^2+x);
    yn2=sqrt(x+1);
    yn3=ones(size(x));
    X=[yn1;yn2;yn3];
    %拟合,得到系数
    Pn=X'\y';
    yn=Pn(1)*yn1+Pn(2)*yn2+Pn(3)*yn3;
    
    %绘图
    figure()
    subplot(1,2,1)
    plot(x,y,'linewidth',1.5,'MarkerSize',15,'Marker','.','color','k')
    legend('原始数据点','Location','southoutside','Orientation','horizontal')
    legend('boxoff')
    subplot(1,2,2)
    hold on
    x2=0:0.01:10;
    plot(x2,Pn(1)*sin(0.2*x2.^2+x2)+Pn(2)*sqrt(x2+1)+Pn(3),'-','linewidth',1.5,'color','r')
    plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
    hold off
    box on
    legend('拟合曲线','数据点','Location','southoutside','Orientation','horizontal')
    legend('boxoff')
    

    事实上,其实常用的拟合方式中,有很多都是线性拟合,比如多项式拟合,傅里叶拟合等。对于多项式拟合,只需要把拟合的部分替换成x,x.^2,x.^3这种形式。对于傅里叶级数,只需要把拟合的部分替换为sin(x),sin(2*x),sin(3*x)这种形式就行。

    下面展示一个利用线性拟合,进行不同频率的三角波级数拟合正弦函数的例子:
    在这里插入图片描述

    clear;
    clc;
    close all
    t=0:0.001:2*pi;%原函数
    YS=sin(t);%基函数
    N=21;
    Yo=[];
    for k=1:N
        Yn=sawtooth(k*(t+pi/2),0.5);
        Yo=[Yo,Yn'];
    end
    YS=YS';%拟合
    a = Yo\YS;
    %绘图
    figure()
    for k=1:N
        clf
        plot(t,Yo(:,1:k)*a(1:k,:),t,YS,'LineWidth',1)
        ylim([-1.3,1.3])
        xlim([0,6.3])
        pause(0.1)
    end
    

    2 一维非线性拟合

    2.1 简单的非线性拟合

    前面介绍了线性的拟合方法。如果一个非线性方程,可以化为上面线性方程中公式中给出的样子,那么我们也可以套用线性的方法去求解。

    比如下面的方程:
    y = a ∗ exp ⁡ ( − b x ) y=a*\exp(-bx) y=aexp(bx)
    经过取对数变换,可以变为下面等效的线性形式:
    lg ⁡ ( y ) = lg ⁡ ( a ) + b ∗ ( − x ) \lg(y)=\lg(a)+b*(-x) lg(y)=lg(a)+b(x)
    这样求出来之后,再反变换回去,就可以得到原方程的系数了。
    在这里插入图片描述
    代码如下:

    clear
    clc
    close all
    
    %方法1
    x=0:0.5:10;
    a=2.5;
    b=0.5;
    %原函数
    y=a*exp(-b*x);
    y=y+0.5*y.*rand(size(y));%加噪声
    %变形函数
    %Lg_y=Lg_a+b*(-x)
    Lg_y=log(y);
    %拟合部分
    yn1=ones(size(x));
    yn2=-x;
    X=[yn1;yn2];
    %拟合,得到系数
    Pn=X'\Lg_y';
    %反变换
    a_fit=exp(Pn(1));
    b_fit=Pn(2);
    %绘图
    figure()
    hold on
    x2=0:0.01:10;
    plot(x2,a_fit*exp(-b_fit*x2),'-','linewidth',1.5,'color','r')
    plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
    hold off
    

    2.2 matlab中Curve Fitting App

    matlab自带了一个Curve Fitting App,它在matlab集成的App里面。
    在这里插入图片描述
    界面左边输入数据,右侧选择方法。
    在这里插入图片描述
    界面里常用的拟合方式都有,而且直接展示拟合效果,非常方便。非常适合鼠标直接拖拖拽拽点点点的操作方式。

    2.3 matlab中非线性拟合的实现

    2.3.1 fit()函数

    matlab中,fit()函数是一个比较通用的用于函数拟合的函数。它的优点就是非常的全面,可以用于各种种类的拟合。上面的App里,很多拟合种类都是间接调用了fit函数来实现的拟合。

    对于非线性拟合,可以使用fit()函数中的Nonlinear Least Squares方法。其大概原理为,首先确定一个初始的点,计算该点的雅可比矩阵J,来近似线性化的判断该点周围的趋势,并将这个点向更小的方向移动。

    因此,这个方法的一个缺点在于,对于初始点的选取非常敏感,最终结果只能在初始点附近的局部最小值点上,而不能保证全局最小值。

    2.3.2 nlinfit()函数

    相比于前面的fit()函数,nlinfit()函数是matlab专门的非线性拟合函数。对于非稳健估计,采用的是Levenberg-Marquardt(LM)方法,也叫阻尼最小二乘法。对于稳健估计,采用的是Iteratively Reweighted Least Squares方法,也就是在Least Squares基础上,对每一个拟合点的权重进行调整的一种方法。这两者方法也都是基于雅克比矩阵的方法。

    2.3.3 lsqnonlin()函数和lsqcurvefit()函数

    lsqnonlin()也是matlab中自带的一个非线性拟合函数。它给出了两种计算非线性拟合的方法,一种是比较经典之前介绍过的LM方法,一种是信赖域方法。信赖域法(trust region reflective)是通过Hessian 矩阵,逐步试探邻域内的最小化,来求解问题的。相比较之前的那些雅克比相关的方法,信赖域法会占用更多内存和速度,所以适用于中小规模的矩阵。

    lsqcurvefit()函数和lsqnonlin()内容上相似,只是引用格式上有所不同。

    2.3.4 fsolve()函数

    这也是一个求解非线性方程的函数,可以求解方程组或者矩阵形式,功能非常强大。默认的算法为trust-region-dogleg,俗称狗腿法,属于信赖域法。这里用到的功能比较基础,所以也不过多介绍了。

    2.3.5 粒子群算法

    说了那么多,发现逐渐从如何非线性拟合,陷入到了最优化的深坑里。而且前面的那么多方法,很多都解决不了陷入到局部最优解的问题。实际上,这种问题如果进入了最优化领域,很多智能算法也可以被考虑进来。所以我也把粒子群PSO算法加入到了里面,尝试将结果收敛到全局最优解。

    2.3.6 不同算法的对比效果

    第一个例子是 y=a.*exp(-b\*(x-c).^2)+d,一个简单的高斯函数形式的非线性方程,其参数给定为:

    abcd
    3.82.14.4-1.3

    在已知函数形式,求解这四个参数条件下,6种不同的函数非拟合效果如下:
    在这里插入图片描述
    可以看到,这几种方法都能够较好的拟合出想要的结果。

    第二个例子是一个指数增长的正弦函数,在很多线性系统中都可以测量到这种信号。函数的形式为:

    y=a*x+b*sin(c*x).*exp(d*x)+e 。其给定的参数为:

    abcde
    -0.32.14.40.31.7

    这个函数的拟合具有一定难度,拟合过程中会遇到非常多的局部解。

    在这里插入图片描述
    由于初始点比较随机,所以最终结果每次都会不一样。
    其中前面的几种方法对于初始值的敏感度比较高,如果初始值选的比较接近原始解,也是可以得到较好的结果。其中nlinfit函数经常会报错,容错率较低。而PSO算法经常能够收敛到最优解(虽然不是每次都可以,偶尔也会陷入局部解)。

    代码如下:

    clear
    clc
    %函数大比拼
    close all
    
    %初始设置
    x = 0:0.1:10;
    a = -0.3;
    b = 2.1;
    c = 4.4;
    d = 0.3;
    e = 1.7;
    
    y = a*x+b*sin(c*x).*exp(d*x)+e;
    noise = 0.05*abs(y-1).*randn(size(x));
    y = y+noise;%加噪声函数
    
    figure();%plot(x,y)
    y_lim = [-40,40];
    
    %% 1 fit()函数 Least Squares
    ft = fittype( 'a*x+b*sin(c*x).*exp(d*x)+e', 'independent', 'x', 'dependent', 'y' );
    OP1 = fitoptions( 'Method', 'NonlinearLeastSquares' );
    OP1.StartPoint = 5*rand(1,5);%初始值,越靠近真实值越好
    OP1.Lower = [-2,0,2,0,0];%参数的最小边界
    OP1.Upper = [1,3,5,3,3];%参数的最大边界
    %拟合
    fitobject = fit(x',y',ft,OP1); 
    a2=fitobject.a;
    b2=fitobject.b;
    c2=fitobject.c;
    d2=fitobject.d;
    e2=fitobject.e;
    %展示结果
    y1 = a2*x+b2*sin(c2*x).*exp(d2*x)+e2;
    subplot(3,2,1)
    hold on
    plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
    plot(x,y1,'-','linewidth',1.5,'color','r')
    hold off
    box on
    ylim(y_lim)
    title('fit函数')
    
    %% 2 nlinfit()函数 Levenberg-Marquardt %容易报错
    modelfun = @(p,x)( p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5) );
    
    OP2 = statset('nlinfit');
    %opts.RobustWgtFun = 'bisquare';
    p0 = 5*rand(1,5);
    p = nlinfit(x,y,modelfun,p0,OP2);
    %拟合
    y2 = p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5);
    subplot(3,2,2)
    hold on
    plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
    plot(x,y2,'-','linewidth',1.5,'color','r')
    hold off
    box on
    ylim(y_lim)
    title('nlinfit函数')
    
    %% 3 lsqnonlin()函数 trust-region-reflective
    modelfun = @(p)(p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5) -y) ;%这里和nlinfit()函数定义不一样
    p0 = 5*rand(1,5);
    OP3 = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective','MaxFunctionEvaluations',1e4,'MaxIterations',1e3);
    [p,~] = lsqnonlin(modelfun,p0,[-2,0,2,0,0],[1,3,5,3,3],OP3);
    y3 = p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5);
    subplot(3,2,3)
    hold on
    plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
    plot(x,y3,'-','linewidth',1.5,'color','r')
    hold off
    box on
    ylim(y_lim)
    title('lsqnonlin函数')
    
    %% 4 lsqcurvefit()函数 trust-region-reflective
    modelfun = @(p,x)(p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5)) ;%这里和其它函数的定义也不一样
    p0 = 5*rand(1,5);
    OP4 = optimoptions('lsqcurvefit','Algorithm','trust-region-reflective','MaxFunctionEvaluations',1e4,'MaxIterations',1e3);
    [p,~] = lsqcurvefit(modelfun,p0,x,y,[-2,0,2,0,0],[1,3,5,3,3],OP4);
    y4 = p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5);
    subplot(3,2,4)
    hold on
    plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
    plot(x,y4,'-','linewidth',1.5,'color','r')
    hold off
    box on
    ylim(y_lim)
    title('lsqcurvefit函数')
    
    %% 5 fsolve()函数 %默认算法trust-region-dogleg
    modelfun = @(p)(p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5) -y);
    p0 = 5*rand(1,5);
    OP5 = optimoptions('fsolve','Display','off');
    p = fsolve(modelfun,p0,OP5);
    y5 = p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5);
    subplot(3,2,5)
    hold on
    plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
    plot(x,y5,'-','linewidth',1.5,'color','r')
    hold off
    box on
    ylim(y_lim)
    title('fsolve函数')
    
    %% 6 粒子群PSO算法
    fun = @(p) ( norm(p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5) -y) );%这里需要计算误差的平方和
    OP6 = optimoptions('particleswarm','InertiaRange',[0.4,1.2],'SwarmSize',100);
    [p,~,~,~]  = particleswarm(fun,5,[-5,-5,-5,-5],[5,5,5,5],OP6);%区间可以稍微放大一些,不怕
    y6 = p(1)*x+p(2)*sin(p(3)*x).*exp(p(4)*x)+p(5);
    subplot(3,2,6)
    hold on
    plot(x,y,'LineStyle','none','MarkerSize',15,'Marker','.','color','k')
    plot(x,y6,'-','linewidth',1.5,'color','r')
    hold off
    box on
    ylim(y_lim)
    title('PSO算法')
    

    下图展示了PSO求解过程中逐渐收敛到全局最优解的过程。
    在这里插入图片描述

    3 高维非线性方程组拟合

    3.1 一般形式高维方程或方程组的拟合

    之前的文章中的数据具有一 一对应的特点,所以严格来讲并不是普遍的二维拟合。对于一些复杂的二维函数,比如椭圆,可能原本的拟合就会失效。

    对于这种一般性质的方程或方程组,将原本输入方程整理为f(x,y,z,…)=0的形式。衡量拟合程度的优化函数,就直接取函数f(xi,yi,zi,…)的值即可。

    下面演示最终的两个例子:

    第一个是三维直线,采用两平面式描述。

    Ax+By+Cz-1=0
    Dx+Ey+Fz-1=0
    

    总共2个方程,维度为3维,第一个方程有3个参数,第二个方程也有3个参数。离散点已知的条件下,三维直线的两平面表达式不唯一。

    最终拟合效果如下:

    在这里插入图片描述

    第二个是二维椭圆,方程为:

    x^2+Axy+By^2+Cx+Dy+E=0
    

    总共1个方程,维度为2维。方程共有5个参数。

    最终拟合效果如下:
    在这里插入图片描述

    clear
    clc
    close all
    %% 演示1
    %1 导入数据(这里用的是人工生成的数据)
    %三维直线拟合,函数表示
    %1.0*x+1.9*y+3.0*z=1;
    %1.2*x-0.4*y-1.7*z=1;
    x=0:0.04:1;
    %求解出y和z
    % [ 1.0, 3.0    [ y        [1.0
    %  -0.4,-1.7] *   z] = 1 -  1.2] x
    y=zeros(size(x));z=y;
    for k=1:length(x)
        R=[1.9,3.0;-0.4,-1.7]\[1-1.0*x(k);1-1.2*x(k)];
        [y(k),z(k)]=Value(R);
    end
    rand_n=randperm(length(x));
    %生成随机的初始输入数据
    x1=x(rand_n)+0.05*randn(size(x));
    y1=y(rand_n)+0.05*randn(size(x));
    z1=z(rand_n)+0.05*randn(size(x));
    %2 整理格式,将数据和要拟合的函数进行格式整理
    %准备数据
    XX={x1,y1,z1};
    %准备函数
    F1=@(p1,XX1) p1(1)*XX1{1}+p1(2)*XX1{2}+p1(3)*XX1{3}-1;
    F2=@(p2,XX2) p2(1)*XX2{1}+p2(2)*XX2{2}+p2(3)*XX2{3}-1;
    FF={F1,F2};
    %3 生成最终优化函数,带入到优化方程中求解
    fun=@(p) Dis(p,{3,3},XX,FF);%p参数,{3,3}第一个方程3个参数,第二个方程3个参数。XX离散点。FF函数表达式。
    OP=optimoptions('particleswarm','FunctionTolerance',0);
    [p,fval,~,~]=particleswarm(fun,6,[-5,-5,-5,-5,-5,-5],[5,5,5,5,5,5],OP);
    %4 对比拟合效果
    figure()
    x2=0:0.01:1;
    y2=zeros(size(x2));
    z2=y2;
    for k=1:length(x2)
        R=[p(2),p(3);p(5),p(6)]\[1-p(1)*x2(k);1-p(4)*x2(k)];
        [y2(k),z2(k)]=Value(R);
    end
    %系数可能不同。因为直线的两平面表示不唯一
    hold on
    plot3(x2,y2,z2)
    plot3(x1,y1,z1,'*');
    hold off
    view(3)
    
    %% 演示2
    %1 导入数据(这里用的是人工生成的数据)
    %二维椭圆拟合
    th=0:0.15:2*pi;
    a=3.2;%椭圆轴1
    b=4.8;%椭圆轴2
    x0=-1.9;
    y0=-4.1;
    beta=1.1;%椭圆旋转角度
    %绘制椭圆
    x=a*cos(th);
    y=b*sin(th);
    %旋转beta角度
    x_r=x*cos(beta)-y*sin(beta);
    y_r=x*sin(beta)+y*cos(beta);
    rand_n=randperm(length(x));
    %生成随机的初始输入数据
    x1=x_r(rand_n)+0.1*randn(size(x));
    y1=y_r(rand_n)+0.1*randn(size(x));
    %2 整理格式,将数据和要拟合的函数进行格式整理
    %准备数据
    XX={x1,y1};
    %准备函数
    F1=@(p1,XX1) XX1{1}.*XX1{1}+p1(1)*XX1{1}.*XX1{2}+p1(2)*XX1{2}.*XX1{2}+p1(3)*XX1{1}+p1(4)*XX1{2}+p1(5);
    FF={F1};
    %3 生成最终优化函数,带入到优化方程中求解
    fun=@(p) Dis(p,{5},XX,FF);
    OP=optimoptions('particleswarm','FunctionTolerance',0);
    [p,fval,~,~]=particleswarm(fun,5,[-20,-20,-20,-20,-20],[20,20,20,20,20],OP);
    %4 对比拟合效果
    figure()
    hold on
    plot(x1,y1,'*')
    Fun_Plot=@(xp,yp) xp.*xp+p(1)*xp.*yp+p(2)*yp.*yp+p(3)*xp+p(4)*yp+p(5);
    fimplicit(Fun_Plot,[-6 6 -6 6],'LineWidth',1)
    hold off
    
    %% 用到的函数
    function varargout=Value(f)
    %多元素赋值,例子:
    %[a,b,c]=Value([1,2,3]);%多变量赋值
    %[xy(1),xy(2),t]=Value([2,5,3]);%复合赋值
    %[b,a]=Value([a,b]);%元素交换
    %来源:hyhhhyh21,matlab爱好者
    N=numel(f);
    varargout=cell(1,N);
    if nargout~=N
        error('输入输出数量不一致')
    end
    for k=1:N
        varargout{k}=f(k);
    end
    end
    
    function Sum_N=Dis(p,p_num,XX,FF)
    %用函数值评价拟合程度
    %输入:要拟合的参数p
    %输入:p_num cell格式,每个方程的参数数量
    %输入:XX 数据,以cell形式储存
    %输入:FF 拟合函数,以cell形式储存
    N_F=numel(FF);%要联立的方程数量
    L=length(XX{1});%离散点的数量
    N_L=numel(XX);%离散点维度
    Sum_N=0;
    XXm=cell(1,N_L);
    %直接计算函数的值
    p_n=1;%参数的索引
    for k=1:N_F
        %对每一个方程进行计算
        FF_k=FF{k};%方程
        F_p=p_num{k};%该方程用到的参数数量
        for m=1:L
            for n=1:N_L
                XXm{n}=XX{n}(m);
            end
            Distance=FF_k(p(p_n:(p_n+F_p-1)),XXm);
            Sum_N=Sum_N+Distance^2;
        end
        p_n=p_n+F_p;%更新函数索引
    end
    end
    

    3.2 一般形式参数方程的拟合

    高维参数方程的拟合比较困难。因为原本方程中x、y、z的坐标点都是已知的。但是参数方程中,x、y、z的坐标点已知,但是与参数u、v往往未知。所以相当于原本的方程中引入了额外的未知信息。

    但是基本思路和普通方程是一样的。离散点距离假想方程的距离,需要用该点距方程上每个点的距离中的最小值,来近似判断。

    依然是展示两个例子。

    第一个是计算三维李萨如图形。参数方程为:

    x=sin(A*u)
    y=cos(B*u)
    z=sin(C*u)
    

    方程为三维参数方程,只有一个参数u。第一个方程有1个未知量A,第二个方程有1个未知量B,第三方程有1个未知量C。

    最终拟合效果如下。由于李萨如图形中,只要频率的比例固定,图案就会固定。所以最终ABC的值不唯一,但是它们的比例肯定唯一。

    在这里插入图片描述
    第二个例子是一个三维旋转曲面。参数方程为:

    x= A*u.*sin(v+B)
    y=-C*u.*cos(v+D)
    z=v
    

    方程为三维参数方程,有2个参数u、v。第一个方程有2个未知量AB,第二个方程有2个未知量CD,第三方程有0个未知量。

    最终拟合效果如下:

    在这里插入图片描述
    这两个例子的演示代码如下。这里参数方程的Dis_P()由于频繁的计算点与点之间的距离,所以运算速度比第一章单纯函数的Dis()较慢。

    clear
    clc
    close all
    %% 演示1
    %三维李萨如图形拟合
    %1 导入数据(这里用的是人工生成的数据)
    t=0:0.01:4*pi;
    x=sin(4*t);
    y=cos(5*t);
    z=sin(6*t);
    
    rand_n=randperm(length(t));
    x1=x(rand_n)+0.02*randn(size(t));
    y1=y(rand_n)+0.02*randn(size(t));
    z1=z(rand_n)+0.02*randn(size(t));
    %2 整理格式,将数据和要拟合的函数进行格式整理
    %输入参数方程
    XX={x1,y1,z1};%离散点输入
    F1=@(p1,uu1) sin(p1(1)*uu1{1});
    F2=@(p2,uu1) cos(p2(1)*uu1{1});
    F3=@(p3,uu1) sin(p3(1)*uu1{1});
    FF={F1,F2,F3};%方程输入
    u1=0:0.05:13;%设置参数的最大最小范围以及精度,能达到绘图精度即可
    uu={u1};%参数输入
    %3 生成最终优化函数,带入到优化方程中求解
    fun=@(p) Dis_P(p,{1,1,1},uu,XX,FF);%使得DisP函数输出的Sum_N最小
    %p参数,{1,1,1}代表有3个方程,每个方程的代求参数p个数为1。uu为参数输入。XX为离散点输入。FF为方程输入。
    OP=optimoptions('particleswarm','FunctionTolerance',0,'InertiaRange',[0.3,1.2],'MaxStallIterations',200);
    [pp,fval,~,~]=particleswarm(fun,3,[1,1,1],[10,10,10],OP);
    %4 对比拟合效果
    figure()
    hold on
    tt=0:0.01:4*pi;
    %pp=pp/pp(1)*4;%这里不一定必须是4,5,6,只需要比例为4:5:6就行
    [a2,b2,c2]=Value(pp);
    x2=sin(a2*tt);
    y2=cos(b2*tt);
    z2=sin(c2*tt);
    
    plot3(x2,y2,z2);
    plot3(x1,y1,z1,'*');
    hold off
    view(3)
    
    %% 演示2
    %三维螺旋面拟合
    %1 导入数据(这里用的是人工生成的数据)
    F1=@(p1,uu1) p1(1).*uu1{1}.*sin(uu1{2}+p1(2));
    F2=@(p2,uu1) -p2(1).*uu1{1}.*cos(uu1{2}+p2(2));
    F3=@(p3,uu1) uu1{2};
    
    u_rand=rand_AB([-4,4],100,1);
    v_rand=rand_AB([-5,5],100,1);
    x=F1([2,0.1],{u_rand,v_rand});
    y=F2([1,0.1],{u_rand,v_rand});
    z=F3([],{u_rand,v_rand});
    
    rand_n=randperm(length(x));
    x1=x(rand_n)+0.01*randn(size(x));
    y1=y(rand_n)+0.01*randn(size(x));
    z1=z(rand_n)+0.01*randn(size(x));
    
    %2 整理格式,将数据和要拟合的函数进行格式整理
    %输入参数方程
    XX={x1,y1,z1};%离散点输入
    FF={F1,F2,F3};%方程输入
    u1=-4:0.1:4;%设置参数的最大最小范围以及精度,能达到绘图精度即可
    v1=-5:0.1:5;%设置参数的最大最小范围以及精度,能达到绘图精度即可
    uu={u1,v1};%参数输入
    %3 生成最终优化函数,带入到优化方程中求解
    fun=@(p) Dis_P(p,{2,2,0},uu,XX,FF);%使得DisP函数输出的Sum_N最小
    OP=optimoptions('particleswarm','FunctionTolerance',0,'InertiaRange',[0.3,1.2],'MaxStallIterations',200);
    [pp,fval,~,~]=particleswarm(fun,4,[0.1,0,0.1,0],[10,2*pi,10,2*pi],OP);
    
    %4 对比拟合效果
    figure()
    hold on
    plot3(x1,y1,z1,'*');
    funx = @(u,v) pp(1)*u.*sin(v+pp(2));
    funy = @(u,v) -pp(3)*u.*cos(v+pp(4));
    funz = @(u,v) v;
    fsurf(funx,funy,funz,[-4 4 -5 5],'LineStyle','none','FaceAlpha',0.5)
    xlim([-8,8]);
    ylim([-8,8]);
    zlim([-5,5]);
    colormap(hsv)
    camlight
    plot3([0,8],[0,0],[0,0],'linewidth',2,'color','k')
    plot3([0,0],[0,8],[0,0],'linewidth',2,'color','k')
    plot3([0,0],[0,0],[0,5],'linewidth',2,'color','k')
    hold off
    view(3)
    
    
    function Sum_N=Dis_P(p,p_num,uu,XX,FF)
    %用距离曲线的距离评价拟合程度(参数方程)
    %输入:p 要拟合的参数
    %输入:p_num 数组,每个方程的参数数量
    %输入:uu 参数方程中的参数,以cell形式储存
    %输入:XX 数据,以cell形式储存
    %输入:FF 拟合函数,以cell形式储存
    
    N_F=numel(FF);%要联立的方程数量
    L=length(XX{1});%离散点的数量
    N_L=numel(XX);%拟合参数p的数量
    N_u=numel(uu);%参数方程中参数的数量
    if N_u>1
        uu_new=ndgrid_h(uu{:});
        uu=uu_new;
    end
    %循环每个点,求到直线的距离
    %在假定参数p的情况下,计算假定函数
    Point_NF=cell(N_F,1);
    p_n=1;%参数的索引
    for k=1:N_F
        F_p=p_num{k};%该方程用到的参数数量
        Point_NF{k}=FF{k}(p(p_n:(p_n+F_p-1)),uu);%计算假定函数各个点坐标
        p_n=p_n+F_p;%更新函数索引
    end
    Sum_N=0;
    for k=1:L
        %分别求每个假定函数的点,与真实离散点之间距离的平方和
        Point_distance2=0;
        for m=1:N_F
            %读取真实点坐标
            Point_distance2=Point_distance2+(Point_NF{m}-XX{m}(k)).^2;
        end
        Min_distance2=min(Point_distance2);%求出最小距离,即为点与假定函数之间的距离
        Sum_N=Sum_N+Min_distance2;
    end
    end
    
    
    function varargout=Value(f)
    %多元素赋值,例子:
    %[a,b,c]=Value([1,2,3]);%多变量赋值
    %[xy(1),xy(2),t]=Value([2,5,3]);%复合赋值
    %[b,a]=Value([a,b]);%元素交换
    %来源:hyhhhyh21,matlab爱好者
    N=numel(f);
    varargout=cell(1,N);
    if nargout~=N
        error('输入输出数量不一致')
    end
    for k=1:N
        varargout{k}=f(k);
    end
    end
    
    function X=rand_AB(AB,varargin)
    %生成区间[A,B]之间的随机分布
    %除了AB之外,其余输入与rand相同
    [A,B]=Value(AB);
    X=rand(varargin{1:end});
    X=A+X*(B-A);
    end
    
    function S=ndgrid_h(varargin)
    %来源于matlab自带的源代码。
    %用法和ndgrid用法一样,但是将输出更改为cell
    N=nargin;
    S=cell(1,N);
    if N==1
        S{1}=varargin;
    else 
        j = 1:N;
        siz = cellfun(@numel,varargin);
        if N == 2 % Optimized Case for 2 dimensions
            x = full(varargin{1}(:));
            y = full(varargin{2}(:)).';
            S{1} = repmat(x,size(y));
            S{2} = repmat(y,size(x));
        else
            for i=1:N
                x = full(varargin{j(i)});
                s = ones(1,N);
                s(i) = numel(x);
                x = reshape(x,s);
                s = siz;
                s(i) = 1;
                S{i} = repmat(x,s);
            end
        end
    end
    S2=cell(1,N);
    for k=1:N
        S2{k}=S{k}(:);
    end
    S=S2;
    end
    

    主要函数就是Dis和Dis_P,准备工作就是把方程和离散点整理成可以输入的形式。优化用到的函数就是PSO(particleswarm),需要更改未知参数数量和范围就可以。

    3.3 补充

    这一部分的拟合优度或者置信区间就没办法拿出来说了,毕竟有试凑的嫌疑。适合单纯的验证。

    另外这里和最小二乘求出来的结果会有所不同。这主要是定义的问题。其中最小二乘指的是距离y方向上最小的二乘距离。而这一章节中定义的最小二乘,是指的点到拟合曲线距离的最小二乘(有点类似于主成分分析)。虽然一般情况下两者并不会有太大差别,但是如果有误差的话,还请注意这一点,

    如下图,这里是一个椭圆分布的离散点。
    在这里插入图片描述
    如果将方程的形式定义为y=ax+b,要求距离y最小,则最终结果为红色的线。如果将方程定义为ax+by+c=0,要求距离直线的距离最小,则最终拟合结果为黄色的线。这里无所谓对错,只是要求的最小定义不同。

    单独在后面补充了这么一个章节,希望在应用中注意。

    参考文献

    信赖域法 https://zhuanlan.zhihu.com/p/205555114

    展开全文
  • MATLAB拟合多元非线性函数?时间:2019-9-20MATLAB拟合多元非线性函数?自变量x1=【101 98.4 98.8 98.5 98.6 98.2 98.8 99.2 99.5 100.6 101.9 101.5 102.7 102.4 102.8 103.1 102.9 103.3 103.5 103.6 104.4 105.1 ...
  • MATLAB进行非线性拟合

    千次阅读 2020-04-20 16:59:39
    matlab进行非线性拟合常用最小二乘法,适用于:已经求解出函数,但含有未知数,不过已经收集到了一系列数据 1.lsqcurvefit 格式:[x, resnorm,r,flag]=lsqcurvefit(fun, c0,xdata,ydata) c0为初始解向量;xdata,...
  • MATLAB中有一个多元非线性拟合的功能是nlinfit 基本语法是: beta = nlinfit(X,Y,modelfun,beta0) 式子左边的beta可以是一个向量,向量的元素就是要回归的模型中的参数。 式子右边,modelfun是要回归的函数...
  • matlab多元非线性回归

    2014-09-22 13:41:39
    matlab多元非线性回归
  • matlab-非线性拟合函数lsqcurvefit的使用和初值选取 所解决问题: 我们知道我们的表达式是y=A+B*exp(-x.^2)-C./log(x), 而且现在我们手里面有x与y对应的一大把数据。 我们需要根据x, y的值找出最佳...
  • Matlab多元非线性回归(nlinfit 函数)

    万次阅读 2020-01-10 14:05:50
    Matlab中使用nlinfit 函数进行多元非线性回归。
  • matlab多元非线性回归及显著性分析给各位高手:小弟有一些数据需要回归分析(非线性)及显著性检验(回归模型,次要项,误差及失拟项纯误差,F值和P值),求大侠帮助,给出程序,不胜感激。模型:DA TA=... %DA TA前三列...
  • matlab偏最小二乘法代码,整理各种线性和非线性回归,参考网上资料
  • 多元非线性拟合 因变量之间存在相关性 未知函数结构 10个因变量 6个自变量 如何求解10个因变量和每一个自变量之间的函数表达式 数据数目不多,且一些位置为零
  • 在回归分析中,如果有两个或两个以上的自变量,就...看到regress函数的例子,突然想到它居然可以用来做一些简单的多元非线性回归分析,例如,我们用它对一个多项式进行拟合,将要拟合的多项式进行展开,得到的其实...
  • MATLAB求解非线性最小二乘法拟合问题 部分源码 clear;clc;close all A0=[1 1]; A=lsqnonlin('jscs',A0); disp('配偶参数A:') disp(A)
  • matlab多元非线性回归教程》由会员分享,可在线阅读,更多相关《matlab多元非线性回归教程(2页珍藏版)》请在人人文库网上搜索。1、matlab回归(多元拟合)教程前言 1、学三条命令 polyfit(x,y,n)-拟合成一元幂函数...
  • matlab编写实现最小二乘法多元线性拟合,可以得到最终拟合方程,并画出预测的回归系数直方图
  • Matlab非线性拟合工具箱cftool

    千次阅读 2014-11-29 22:16:34
    ,使用方便,能实现多种类型的线性、非线性曲线拟合。下面结合我使用的 Matlab R2007b 来简单介绍如何使用这个工具箱。 假设我们要拟合的函数形式是 y=A*x*x + B*x, 且A>0,B>0 。 1、在命令行输入数据: 》...
  • 前两天练题的时候要用到多元非线性拟合,但是在网上找到的大多都是一些求问的帖子,真正有用的回答却不多,这里汇总一下与大家分享。 首先导入数据(参数和结果) 确定自己要拟合的函数(自己画个散点图预估一下,...
  • 本程序可以直接用于进行拟合
  • 基于MATLAB的均匀设计实验数据多元非线性最小二乘拟合.pdf
  • Matlab中的lsqcurvefit,非线性拟合

    万次阅读 2016-06-14 09:17:57
    本文转载,关于Matlab非线性拟合laqcurvefit的使用简要说明
  • matlab 非线性拟合 y= 1 / (a + b * x)

    千次阅读 2019-07-11 20:32:23
    一、题目 已知: y= 1 / (a + b * x) x = 1.0 : 0.4 : 2.6; ...y = [0.931, 0.473, 0.297, 0.224, 0.168];...通过各种拟合方法求a, b的值,画出拟合曲线,并比较结果,分析误差 二、思路导图 三、流 程 图 ...
  • 比如z=f(x,y),给出(x,y,z)的多个数据点,然后怎么拟合出f函数,给出源码就更好了</p>
  • 首先对于函数进行分析:该函数是一个比较强的非线性函数,所以不能用一般的最小二乘法来进行拟合,如过一定要用最小二乘法,则A必须是已知的,再利用最二乘法进行拟合,附程序2.
  • 基于MATLAB多元非线性回归模型.pdf
  • 拟合问题,我一般不再用MATLAB了,都是用1stopt软件。具体代码如下:Variable x1,x2,x3,x4,yz;Function yz=a*((-0.088)*(x1)^3+20.909*x1^2-1654.3*x1+43990)+b*368.31*exp(0.3316*x2)+c*(-13.042*x3+592.47)+d*532....
  • matlab多元非线性回归_推荐matlab 回归(拟合)总结前言1、学三条命令polyfit(x,y,n)拟合成一元幂函数(一元多次)regress(y,x)可以多元,nlinfit(x,y,’fun’,beta0) (可用于任何类型的函数,任意多元函数,应用范围最...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,728
精华内容 691
关键字:

matlab多元非线性拟合

matlab 订阅