Método de cálculo numérico-ajuste por mínimos cuadrados

Requisito:
escribir una función, entrada como matriz de nodo, función base, imagen de salida, nodo de visualización y curva de ajuste;
Teoría:
Mínimos cuadrados es un requisito que para una columna de datos dada, se requiere
Inserte la descripción de la imagen aquí
encontrar una función en una determinada clase de función : , Inserte la descripción de la imagen aquí
tal que Satisfactorio Inserte la descripción de la imagen aquí
De acuerdo con las condiciones anteriores, se puede ver que el punto
Inserte la descripción de la imagen aquí
es
Inserte la descripción de la imagen aquí
el punto mínimo de la función multivariante , que satisface el sistema de ecuaciones,
Inserte la descripción de la imagen aquí
es decir,
Inserte la descripción de la imagen aquí
recuerde Inserte la descripción de la imagen aquí
, el sistema de ecuaciones anterior se puede expresar como, (k = 0 , 1,…, n)
escrita en forma matricial
Inserte la descripción de la imagen aquí
, esta ecuación está compuesta Es un sistema de ecuaciones normales Se puede demostrar que cuando es Inserte la descripción de la imagen aquí
linealmente independiente, tiene una única solución.
En particular, un caso común de ajuste de curvas son los polinomios algebraicos, es decir, tome
Inserte la descripción de la imagen aquí
, luegoInserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

(k = 0,1,…, n)
por lo que las ecuaciones normales correspondientes se convierten en
Inserte la descripción de la imagen aquí

, Este es el principio de mínimos cuadrados.
Código de Matlab:

①主函数
function u=OLSE_t(x,y,w,a)
syms b;
p=zeros(a,a);
f=zeros(a,1);
fai=zeros(a,length(x));
for m = 1:length(x)
    fai(1,m)=log(x(m));
    fai(2,m)=cos(x(m));
    fai(3,m)=exp(x(m));
end
for i = 1:a
    for j = 1:a
        for m = 1:length(x)
            p(i,j)=p(i,j)+w(m)*fai(i,m)*fai(j,m);
        end
    end
end
for i = 1:a
    for m = 1:length(y)
        f(i,1)=f(i,1)+w(m)*y(m)*fai(i,m);
    end
end
u=res(p,f)
%计算平凡误差
det1=0;
det2=0;
for m = 1:length(y)
    det1 = det1 + w(m)*y(m)^2;
    for i = 1:a
        det2=det2+u(i,1)*w(m)*y(m)*fai(i,m);
    end
end
det = det1-det2
S=u(1,1)*log(b)+u(2,1)*cos(b)+u(3,1)*exp(b);
value=x(1):0.1:x(end);
S=subs(S,b,value);
plot(value,S);hold on;
plot(x(:),y(:),'*')
②线性方程求解
1)
function a=res(A,b)
n = length(A);
m = zeros(n);%存放行乘数
 
format long
    for k = 1:n-1
        temp = abs(A(k:n,k));%选主元比较的是绝对值的最大值
        [value index] = max(temp);%选主元
        u = index + k - 1;%调整为正确的最大行的索引
        if u ~= k %选主元,换行
            temp1 = A(u,k:n);
            temp2 = b(u);
            A(u,k:n) = A(k,k:n);
            b(u) = b(k);
            A(k,k:n) = temp1;
            b(k) = temp2;
        end 
        m(k+1:n,k) = A( k+1:n,k)/A(k,k);%计算行乘数
        A(k+1:n,k:n) = A(k+1:n,k:n) - m(k+1:n,k)*A(k,k:n);
        b(k+1:n) = b(k+1:n) - m(k+1:n,k)*b(k);
    end
    a=slo(A,b);
end
2)
function x=slo(A,b)
    n = length(b);
    x = zeros(n,1);
    x(n) = b(n)/A(n,n);
if istriu(A)
    for i = n-1:-1:1
        x(i) = (b(i)-A(i,i+1:n)*x(i+1:n))/A(i,i);
    end  
else
    disp("输入错误,请输入上三角")
end
disp('x=');
disp(x);
end

Resultados de ejecución del programa:
①La entrada es:
x = [0.24,0.65,0.95,1.24,1.73,2.01,2.23,2.52,2.77,2.99];
y = [0.23, -0.26, -1.10, -0.45,0.27,0.10, -0.29,0.24,0.56,1.00];
w = [1,1,0.8,0.9,1,1,1,1,0.9,0.9];
a = 3;
u = OLSE_t (x, y, w, a)
La función base se selecciona como
Inserte la descripción de la imagen aquí
② El resultado de salida es: los
parámetros a determinar son: el
Inserte la descripción de la imagen aquí
error cuadrado es:
Inserte la descripción de la imagen aquí
Se emite la imagen de la curva de la función de ajuste:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_46837674/article/details/113032037
Recomendado
Clasificación