-2

問題は次のように述べています。3つの引張試験がアルミニウム棒で実行されました。各試験において、ひずみは同じ応力値で測定されました。結果は ここに画像の説明を入力してください

ここで、ひずみの単位はmm / mです。線形回帰を使用して、バーの弾性係数を推定します(弾性係数=応力/ひずみ)。

私はこの問題のためにこのプログラムを使用しました:

function coeff = polynFit(xData,yData,m)
% Returns the coefficients of the polynomial
% a(1)*x^(m-1) + a(2)*x^(m-2) + ... + a(m)
% that fits the data points in the least squares sense.
% USAGE: coeff = polynFit(xData,yData,m)
% xData = x-coordinates of data points.
% yData = y-coordinates of data points.

A = zeros(m); b = zeros(m,1); s = zeros(2*m-1,1);
for i = 1:length(xData)
temp = yData(i);
for j = 1:m
b(j) = b(j) + temp;
temp = temp*xData(i);
end
temp = 1;
for j = 1:2*m-1
s(j) = s(j) + temp;
temp = temp*xData(i);
end
end
for i = 1:m
for j = 1:m
A(i,j) = s(i+j-1);
end
end 
% Rearrange coefficients so that coefficient
% of x^(m-1) is first
coeff = flipdim(gaussPiv(A,b),1);

この問題は、次のようなプログラムなしで解決されます ここに画像の説明を入力してください

私の試み

T=[34.5,69,103.5,138];

D1=[.46,.95,1.48,1.93];

D2=[.34,1.02,1.51,2.09];

D3=[.73,1.1,1.62,2.12];

Mod1=T./D1;

Mod2=T./D2;

Mod3=T./D3;

xData=T;

yData1=Mod1;

yData2=Mod2;

yData3=Mod3;

coeff1 = polynFit(xData,yData1,2);

coeff2 = polynFit(xData,yData2,2);

coeff3 = polynFit(xData,yData3,2);

x1=(0:.5:190);

y1=coeff1(2)+coeff1(1)*x1;

subplot(1,3,1);

plot(x1,y1,xData,yData1,'o');

y2=coeff2(2)+coeff2(1)*x1;

subplot(1,3,2);

plot(x1,y2,xData,yData2,'o');

y3=coeff3(2)+coeff3(1)*x1;

subplot(1,3,3);

plot(x1,y3,xData,yData3,'o');

この結果を得るにはどうすればよいですか?

4

1 に答える 1

3

一般的なアドバイスとして:

  • 可能な限りforループを避けてください。
  • i虚数単位のMatlab組み込み名であるため、j変数名としての使用は避けてください(将来のリリースでなくなることを願っています...)

mインタプリタ言語であるため、forループはコンパイルされた代替言語と比較して非常に遅くなる可能性があります。MatlabはMATtrixLABoratoryという名前で、行列/配列操作用に高度に最適化されていることを意味します。通常、ループなしでは実行できない操作がある場合、Matlabには、Matlabのforループよりもはるかに高速に実行される組み込み関数があります。例:配列内の要素の平均を計算する:mean(x)。配列内のすべての要素の合計:sum(x)。配列内の要素の標準偏差:std(x)。など。Matlabの力はこれらの組み込み関数から来ています。

だから、あなたの問題。線形回帰の問題があります。この問題を解決するためのMatlabでの最も簡単な方法は次のとおりです。

%# your data
stress = [ %# in Pa
    34.5 69 103.5 138] * 1e6;

strain = [ %# in m/m
    0.46 0.95 1.48 1.93
    0.34 1.02 1.51 2.09
    0.73 1.10 1.62 2.12]' * 1e-3;    

%# make linear array for the data
yy = strain(:);
xx = repmat(stress(:), size(strain,2),1);

%# re-formulate the problem into linear system Ax = b
A = [xx ones(size(xx))];
b = yy;

%# solve the linear system
x = A\b;

%# modulus of elasticity is coefficient 
%# NOTE: y-offset is relatively small and can be ignored)
E = 1/x(1)

関数で行ったことpolynFitはによって行われますA\bが、\-operatorは、自分でやろうとしたことよりもはるかに速く、はるかに堅牢で、はるかに柔軟実行できます私はあなたがこれらのものを自分で作ろうとすべきではないと言っているのではありません(それを続けてください、あなたはそれから多くを学びます!)、私は「実際の」結果のために常に\-operatorを使うと言っています(そしてそれに対してあなた自身の結果もチェックしてください)。

バックスラッシュ演算子(help \コマンドプロンプトで入力)は多くの状況で非常に役立ちます。それを学び、よく学ぶことをお勧めします。

私はあなたにこれを残します:これが私があなたのpolynFit関数を書く方法です:

function coeff = polynFit(X,Y,m)

    if numel(X) ~= numel(X)
        error('polynFit:size_mismathc',...  
              'number of elements in matrices X and Y must be equal.');
    end

    %# bad condition number, rank errors, etc. taken care of by \
    coeff = bsxfun(@power, X(:), m:-1:0) \ Y(:);

end

これがどのように機能するかを理解するのはあなたに任せます。

于 2012-10-08T06:48:53.907 に答える