一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

 

这里用到的还是最小二乘方法,和上一次这篇文章原理差不多。

 

就是首先构造最小二乘函数,然后对每一个系数计算偏导,构造矩阵乘法形式,最后解方程组。

 

比如有一个二次曲面:z=ax^2+by^2+cxy+dx+ey+f

 

首先构造最小二乘函数,然后计算系数偏导(我直接手写了):

 

 

解方程组(下图中A矩阵后面求和符号我就没写了啊),然后计算C:

 

 

代码如下:

复制代码
 1 clear all;
 2 close all;
 3 clc;
 4 
 5 a=2;b=2;c=-3;d=1;e=2;f=30;   %系数         
 6 n=1:0.2:20;
 7 x=repmat(n,96,1);
 8 y=repmat(n',1,96);
 9 z=a*x.^2+b*y.^2+c*x.*y+d*x+e*y +f;      %原始模型     
10 surf(x,y,z)
11 
12 N=100;
13 ind=int8(rand(N,2)*95+1);
14 
15 X=x(sub2ind(size(x),ind(:,1),ind(:,2)));
16 Y=y(sub2ind(size(y),ind(:,1),ind(:,2)));
17 Z=z(sub2ind(size(z),ind(:,1),ind(:,2)))+rand(N,1)*20;       %生成待拟合点,加个噪声
18 
19 hold on;
20 plot3(X,Y,Z,'o');
21 
22 A=[N sum(Y) sum(X) sum(X.*Y) sum(Y.^2) sum(X.^2);
23    sum(Y) sum(Y.^2) sum(X.*Y) sum(X.*Y.^2) sum(Y.^3) sum(X.^2.*Y);
24    sum(X) sum(X.*Y) sum(X.^2) sum(X.^2.*Y) sum(X.*Y.^2) sum(X.^3);
25    sum(X.*Y) sum(X.*Y.^2) sum(X.^2.*Y) sum(X.^2.*Y.^2) sum(X.*Y.^3) sum(X.^3.*Y);
26    sum(Y.^2) sum(Y.^3) sum(X.*Y.^2) sum(X.*Y.^3) sum(Y.^4) sum(X.^2.*Y.^2);
27    sum(X.^2) sum(X.^2.*Y) sum(X.^3) sum(X.^3.*Y) sum(X.^2.*Y.^2) sum(X.^4)];
28 
29 B=[sum(Z) sum(Z.*Y) sum(Z.*X) sum(Z.*X.*Y) sum(Z.*Y.^2) sum(Z.*X.^2)]';
30 
31 C=inv(A)*B;
32 
33 z=C(6)*x.^2+C(5)*y.^2+C(4)*x.*y+C(3)*x+C(2)*y +C(1);           %拟合结果
34 
35 mesh(x,y,z)
复制代码

结果如下,深色曲面是原模型,浅色曲面是用噪声数据拟合的模型:

 

posted on   一杯清酒邀明月  阅读(1223)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示