linear-regression - 使用线性系统 Ax =b 的预处理器减少误差
问题描述
我正在尝试解决非线性系统的 Ax = b,我的 A 矩阵是 10x4 复数双精度数,b 矩阵是 10x1 双精度数
一个矩阵:
b矩阵:
我已经有了 x 的原始值,它们是
x_original = [800000000;200000000;10000;10000]; % coefficients to find
我需要解决系统问题,使我找到的 x 的值接近 x_original。系统规模严重,我需要使用预处理器。有谁知道如何制作一个好的预处理器?或者如何解决这个问题。到目前为止,我已经这样做了:
% FFT force vector of X and Y values
b = [484.3603;252.2655;491.6905;429.6085;58.7645;127.1524;66.0117;129.4595;72.3755;85.87534];
% Fourier Coefficients of 0,1,2,3,4 order
B =[-3.43774677078494e-07 -4.20221293933872e-07 -0.00701727121110309 -0.00572957795130823 ; 4.20221293933872e-07 -3.43774677078494e-07 0.00572957795130823 -0.00701727121110309; 1.37693217325839e-07 + 1.56288664413688e-07i 2.92816693096910e-07 + 3.83805328364969e-08i -5.61381696888257e-05 + 0.00371276651244773i 0.00316272702912214 + 0.00134731607253179i ; -2.92816693096910e-07 - 3.83805328364969e-08i 1.37693217325839e-07 + 1.56288664413688e-07i -0.00316272702912214 - 0.00134731607253179i -5.61381696888257e-05 + 0.00371276651244773i; -9.52668385119923e-09 - 9.91624629383402e-09i -1.10443989519006e-07 + 4.38271460313829e-08i -0.000300708115807454 + 0.00112742378667937i -0.000905574528404713 + 0.000465016518748114i; 1.10443989519006e-07 - 4.38271460313829e-08i -9.52668385119923e-09 - 9.91624629383402e-09i 0.000905574528404713 - 0.000465016518748114i -0.000300708115807454 + 0.00112742378667937i; 2.15322298323200e-08 - 1.38823640633450e-08i 1.51798935991015e-08 - 7.89637438295323e-08i 0.000123699423967003 + 0.000670222670400645i 0.000260884166972916 - 0.000770828627122605i; -1.51798935991015e-08 + 7.89637438295323e-08i 2.15322298323200e-08 - 1.38823640633450e-08i -0.000260884166972916 + 0.000770828627122605i 0.000123699423967003 + 0.000670222670400645i; 9.57379529241477e-09 + 1.21238347959597e-08i 4.00282625674296e-08 + 4.12789159719483e-08i 4.30157250981611e-05 + 0.000723503482611052i 0.000448205639180228 + 0.000434001884691301i; -4.00282625674296e-08 - 4.12789159719483e-08i 9.57379529241477e-09 + 1.21238347959597e-08i -0.000448205639180228 - 0.000434001884691301i 4.30157250981611e-05 + 0.000723503482611052i];
% Multiplication factor for Fourier Coefficients because FFT values are doubled by Matlab
Y =[1;1;2;2;2;2;2;2;2;2];
% Final matrix A
A= bsxfun(@times,B,Y); % Ax = b
fun = @(Pre_Conditioner)Solve(Pre_Conditioner(1),Pre_Conditioner(2),Pre_Conditioner(3),Pre_Conditioner(4),Pre_Conditioner(5),Pre_Conditioner(6),Pre_Conditioner(7),Pre_Conditioner(8),Pre_Conditioner(9),Pre_Conditioner(10),A,b)
% initial value for Preconditioner iterations
x0 = [1;8800;8800;2;2;2;2;2;-8800;-2]
[x] = lsqnonlin(fun,x0)
求解函数如下:
function [error] = Solve(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, A, b)
% Preconditioner
Pre_Conditioner =[x1;x2;x3;x4;x5;x6;x7;x8;x9;x10].^(-1);
A = bsxfun(@times,A,Pre_Conditioner);
b = Pre_Conditioner.*b;
% Solve the equation Ax = b using Least Squares Method
% Numerical Method
x_2 = inv(A.'*A)*A.'*b; % Least Square Estimation
x_2 = abs(x_2);
x_original = [800000000;200000000;10000;10000]; % coefficients to find
% Error calculation
for i =1:1:size(x_original,1)
error_percent(i,1) = (abs((x_original(i)-x_2(i)))/x_original(i))*100
end
error = error_percent(1,1)+error_percent(2,1)+error_percent(3,1)+error_percent(4,1)
%error = error_percent(1,1)*error_percent(2,1)*error_percent(3,1)*error_percent(4,1)
end
有谁知道如何自动更改预处理器的值,以便我得到最小的错误..?
解决方案
推荐阅读
- c# - Opengl鼠标旋转问题
- sql - 目标表为空时Oracle SQL 合并不插入
- android - 如何将多个带有 JSON 的图像文件从 android 上传到服务器?
- javascript - 在 ARMv6 上安装时出现 npm 模块 SQLite3 错误
- bash - 为什么忽略尾随退格?
- php - 这个逻辑有什么问题吗
- java - maven依赖管理机制,使用import scope进行依赖管理的优先级
- javascript - 从 Promise 填充数组时,它显示为“空”-firestore
- blogger - Blogger 自定义布局获取帖子初始文本
- linux - 当使用源(相同的shell)或bash(子shell)调用脚本时,如何从脚本中读取当前文件夹?