1

問題は非常に単純です。四次曲線をノイズのあるデータに当てはめます。Mldivide は、係数に対して誤った値のセットを提供しますが、疑似逆数の直接計算は機能します。

四次方程式: c0 + c1*t + c2*t^2 + c3*t^3 + c4*t^4

入力ファイルには、各サンプルの t と実際の値が含まれています。

fid = fopen('Data_Corr.txt');

A = zeros(4001,5);

for i = 1:4001
    dataPt = fscanf(fid,'%f',2);
    A(i,:) = [1 dataPt(1) dataPt(1)^2 dataPt(1)^3 dataPt(1)^4];
    b(i) = dataPt(2);
end

%c = b\A; %using matlab mldivide
c = inv(A'*A)*A'*b; %computing pseudo inverse directly

for i = 1:4001
    d(i) = A(i,1)*c(1) + A(i,2)*c(2) + A(i,3)*c(3) + A(i,4)*c(4) + A(i,5)*c(5);
end

figure; hold on; grid on;
plot(b,'-b');
plot(d,'r-');
4

1 に答える 1

4

あなたの数式とコードを正しく解釈するとA、t の累乗を表し、bモデル化しようとしているデータが含まれます。したがって、係数ベクトルを使用cすると、解きたい方程式は次のようになります。

b = A * c

を使用してこれを解決mldivideすると、

c = A \ b

pinv結果を使用してそれを解決しながら

c = pinv(A) * b

コードには、これら 2 つの方程式の 2 番目に対応する行が の形式で含まれていc = inv(A'*A)*A'*bます。ただし、バックスラッシュ演算子の使用は間違っています。

あなたの不一致は、このエラーが原因であると強く疑っています。


修正後も不一致が存在する場合、2 つ目の可能性は、線形システムがデータによって十分に決定されていないことです。その場合、 を使用pinvすると、係数の二乗和が最小の解が得られますが、係数がゼロの解sum(c .^ 2)、つまりmldivide「まばらな」解が生成されます。@Dmitryが指摘したように、このソリューションがどの程度正確に到達するかは、関連する行列の正確なプロパティに依存します。例:

A = [1 2 0; 0 4 3];
b = [8; 18];
c_mldivide = A \ b
c_pinv = pinv(A) * b

出力を与える

c_mldivide =

                     0
                     4
      0.66666666666667


c_pinv =

     0.918032786885245
      3.54098360655738
      1.27868852459016

システムの 3 つの係数は 2 つのデータ ポイントのみによって制約されるため、そのうちの 1 つを効果的に自由に選択できます。

あなたの場合、データが非常に冗長でない限り、5つの係数を持つ線形システムは4001のデータポイントによって適切に決定される必要があるため、これが当てはまるとは思いません。

于 2013-10-05T13:23:02.423 に答える