掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
相乗平均、調和平均を求めたいのですが・・・ (ID:10230)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
誤差を考えると、多倍長演算にしないといけないかもしれませんが。 こんな感じでしょうか。 式をそのまま当てはめただけなので、速度的にも精度的にも問題があると思います。 //N乗根 function Nsqrt(Value: Extended; N: Integer): Extended; var s: Extended; function Nsqrt_(Value: Extended; N: Integer): Extended; var s, last: Extended; begin last := 1.0; if Value > 1 then s := Value else s := 1; while true do begin last := s; s := (Value / Power(s, N - 1) + (N-1)*s) / N; if not (s < last) then Break; end; Result := last; end; begin Result := 0; if Value = 0 then Exit; s := Nsqrt_(Value, N); Result := (Value / Power(s, N - 1) + (N-1)*s) / N; end; //相加平均 function ArithmeticMean(Value: array of Extended): Extended; var Ans: Extended; i: integer; begin Ans := 0.0; for i := 0 to High(Value) do begin Ans := Ans + Value[i]; end; Result := Ans / (High(Value) + 1); end; //相乗平均 function GeometricalMean(Value: array of Extended): Extended; var Ans: Extended; i: integer; begin Ans := 1.0; for i := 0 to High(Value) do begin Ans := Ans * Value[i]; end; Result := Nsqrt(Ans, High(Value) + 1); end; //調和平均 function HarmonyMean(Value: array of Extended): Extended; var Ans: Extended; i: integer; begin Ans := 0.0; for i := 0 to High(Value) do begin Ans := Ans + (1 / Value[i]); end; Result := 1 / (Ans / (High(Value) + 1)); end; procedure TForm1.Button1Click(Sender: TObject); var Value: array[0..3] of Extended; begin Value[0] := 1.0; Value[1] := 2.0; Value[2] := 3.0; Value[3] := 4.0; Memo1.Lines.Add('相加平均:' + FloatToStr(ArithmeticMean(Value))); Memo1.Lines.Add('相乗平均:' + FloatToStr(GeometricalMean(Value))); Memo1.Lines.Add('調和平均:' + FloatToStr(HarmonyMean(Value))); end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.