主要内容

Jacobian乘以线性最小二乘函数

使用jacobian乘法函数,您可以解决表格的最小二乘问题

X 1 2 C X - D. 2 2

这样lb≤x≤ub,对于问题在哪里C非常大,也许太大了。对于这种技术,使用'信任区域反光'算法。

例如,考虑一个问题在哪里C是基于循环矩阵的2N-N族矩阵。行的行C是行矢量的班次V.。此示例具有行向量V.与表格的元素 - 1 K. + 1 / K.

V. = [ 1 - 1 / 2 1 / 3. - 1 / 4. ...... - 1 / N ]

元素循环移位的地方。

C = [ 1 - 1 / 2 1 / 3. - 1 / N - 1 / N 1 - 1 / 2 1 / N - 1 1 / N - 1 - 1 / N 1 - 1 / N - 2 - 1 / 2 1 / 3. - 1 / 4. 1 1 - 1 / 2 1 / 3. - 1 / N - 1 / N 1 - 1 / 2 1 / N - 1 1 / N - 1 - 1 / N 1 - 1 / N - 2 - 1 / 2 1 / 3. - 1 / 4. 1 ]

这个最小二乘示例考虑了问题在哪里

D. = [ N - 1 N - 2 ...... - N ]

和约束是 - 5. ≤. X 一世 ≤. 5. 为了 一世 = 1 ...... N

足够大 N ,密集的矩阵C不适合计算机内存( N = 1 0. 0. 0. 0. 一个测试系统太大)。

Jacobian乘法函数具有以下语法。

w = jmfcn(jinfo,y,flag)

jinfo.是矩阵相同的尺寸C,用作前提者。如果C太大而无法适应记忆,jinfo.应该稀疏。y是矢量或矩阵大小C * Y.或者c'* y用作矩阵乘法。旗帜JMFCN.哪个产品形成:

  • 旗帜> 0⇒w = c * y

  • 旗帜<0⇒w = c'* y

  • 旗帜= 0⇒w = c'* c * y

因为C是一种简单的结构矩阵,可以轻松地在向量方面写一个jacobian乘法函数V.;也就是说,没有形成C。每一排C * Y.是循环移位版本的产品V.时代y。用快速循环移位V.

计算C * Y.,计算v * Y.找到第一行,然后转移V.并计算第二行,等等。

计算c'* y,执行相同的计算,但使用移动版本临时,由第一行形成的矢量C'

temp = [fliplr(v),pliplr(v)];

temp = [Cirsprift(TEMP,1,2),CIRCSHIFT(TEMP,1,2)];%现在temp = c'(1,:)

计算c'* c * y,简单地计算C * Y.使用班次V.,然后计算C'使用班次的结果Pliplr(v)

辅助功能lsqcirculant3.是一种实现此过程的Jacobian乘法功能;它出现在此示例的结尾

dolsqjac3.辅助功能在此示例的结尾设置矢量V.并拨打求解器Lsqlin.使用lsqcirculant3.Jacobian乘法函数。

什么时候N= 3000,C是一个18,000,000元素的密集基质。确定结果dolsqjac3.功能N选择值= 3000X,并显示输出结构。

[x,Resnorm,Reseal,ExitFlag,输出] = Dolsqjac3(3000);
地方最低可能。LSQLIN停止,因为功能值的相对变化小于功能公差。
DISP(x(1))
5.0000
DISP(x(1500))
-0.5201.
DISP(x(3000))
-5.0000
DISP(输出)
迭代:16算法:'信任区域 - 反光'Firstordoptopt:5.9351E-05 Cgiterations:36 CorroudViration:[] linearsolver:[]消息:'局部最少可能。↵↵lsqlin停止,因为函数值的相对变化小于功能公差。“

辅助功能

此代码创建lsqcirculant3.帮手功能。

功能w = lsqcirculant3(jinfo,y,标志,v)%此功能计算Jacobian乘法函数对于2N-By-N循环矩阵示例的%如果标志> 0 w = jpositive(y);eleesif标志<0 w = jnegative(y);别的w = jnegative(jpositive(y));结尾功能a = jpositive(q)%计算c * qtemp = v;a = zeros(尺寸(q));%分配矩阵aa = [a; a];%结果是输入的两倍。为了r = 1:大小(a,1)a(r,:)= temp * q;%计算第一个行temp = Cirsprift(TEMP,1,2);%转移循环结尾结尾功能a = jnegative(q)%计算c'* qtemp = pliplr(v);temp = Cirsprift(TEMP,1,2);%转移循环的c'Len =尺寸(q,1)/ 2;%返回的向量只有一半%作为输入向量。A =零(LEN,尺寸(Q,2));%分配矩阵a为了r = 1:len a(r,:) = [temp,temp] * q;%计算第一个行temp = Cirsprift(TEMP,1,2);%转移循环结尾结尾结尾

此代码创建dolsqjac3.帮手功能。

功能[x,Resnorm,Residual,ExitFlag,输出] = Dolsqjac3(n)r = 1:n-1;制作载体的%索引v(n)=(-1)^(n + 1)/ n;%分配矢​​量vv(r)=(-1)。^(r + 1)./ r;%现在C应该是基于V的2N-N循环矩阵,%,但它可能太大,不能适应内存。r = 1:2 * n;d(r)= n-r;jinfo = [speye(n); speye(n)];预处理的%稀疏矩阵%该矩阵是求解器所需的输入;在此示例中未使用%预处理。%传递矢量v,以便它不需要%在雅可比乘法函数中计算。选项= Optimoptions('lsqlin''算法''信任区域反光'......'jacobianmultiplyfcn',@(jinfo,y,flag)lsqcirculant3(jinfo,y,flag,v));lb = -5 *α(1,n);UB = 5 *那些(1,n);[x,Resnorm,剩余,ExitFlag,输出] =......LSQLIN(JINFO,D,[],[],[],[],LB,UB,[],选项);结尾

也可以看看

|

相关话题