2011-01-05 5 views
1

1日の間にある値を表すグラフをExcelで表示しています。だから私は、参照機能を追加し、私はこのような何かを得る:私は知っている必要がありfirts事はにタイムスタンプを変換する方法であるJavaのExcelから多項式関数の値を取得する

09:36:21 => 5,27 

y = 1E-13x6 - 2E-10x5 + 8E-08x4 - 1E-05x3 + 0,0004x2 + 0,0275x + 8,414 

私のデータセット内のmesureをされます関数に与える値。いくつかのセル値の変換の後、私はExcelがタイムスタンプに0.00000と0.99999の間の表現を与えることを発見しました。したがって、例えば09:36:21は0.400243055555556です。それから私は少しJavaのテストスクリプトコード化されました:

double x = 0.400243055555556; 
double x6 = (1*Math.pow(10, -13))*Math.pow(x, 6); 
double x5 = (2*Math.pow(10, -10))*Math.pow(x, 5); 
double x4 = (8*Math.pow(10, -8))*Math.pow(x, 4); 
double x3 = (1*Math.pow(10, -5))*Math.pow(x, 3); 
double x2 = (4*Math.pow(10, -4))*Math.pow(x, 2); 
double y = x6 - x5 + x4 - x3 + x2 + 0.0275*x + 8.414; 

をしかし、このスクリプトを実行した後、私は、Yを取得= 8.425070122712738。これは明らかに機能しません。私は、チャートのすべての値が5から12の範囲にあると言わなければなりません。

私は明らかに何か間違っていますが、私は何が分かりません。たぶん私は関数をひどくコード化しているかもしれません。あるいは、私が選択しているxが正しい値ではないかもしれませんが、何かが間違っています。誰も助けることができますか?

更新:私のコードはあまり良くはありませんでした。しかし、問題は、Excelが私の間違った傾向を与えていたということでした。私は分散グラフを使って良いものを得ることができました。

+1

あなたの初期の仮定は、8.414を追加するときに0と1の間の数字になる可能性があります。他のすべての変数は-1 Jason

+0

x値は0と1の間にあります(私が推測したものがタイムスタンプをどのように変換するのかを見てから)。そしてy値は5から12の範囲です。 – 1000i1

答えて

1

このようにコーディングすることはお勧めできません。丸め誤差が問題になる可能性があります。

私はHorner schemeをお勧めします:

私はそれをこのようにコード化されて、あなたがした同じ答えを得た:ここ

public class Horner 
{ 
    public static final NumberFormat DEFAULT_FORMAT = new DecimalFormat("0.000"); 

    public static void main(String[] args) 
    { 
     double [] a = { 8.414, 0.0275, 0.0004, -1.0e-5, 8.0e-8, -2.0e-10, 1.0e-13 }; 
     for (double x = 0.0; x < 1.0; x += 0.05) 
     { 
     double y = a[0] + x*(a[1] + x*(a[2] + x*(a[3] + x*(a[4] + x*(a[5]))))); 
     System.out.println("x = " + DEFAULT_FORMAT.format(x) + " y = " + DEFAULT_FORMAT.format(y)); 
     } 
    } 
} 

は私が得る結果です。上位の用語はあまりうまくいきません。係数は小さく、分数をべき乗にするとエフェクトがさらに減少します。

x = 0.000 y = 8.414 
x = 0.050 y = 8.415 
x = 0.100 y = 8.417 
x = 0.150 y = 8.418 
x = 0.200 y = 8.420 
x = 0.250 y = 8.421 
x = 0.300 y = 8.422 
x = 0.350 y = 8.424 
x = 0.400 y = 8.425 
x = 0.450 y = 8.426 
x = 0.500 y = 8.428 
x = 0.550 y = 8.429 
x = 0.600 y = 8.431 
x = 0.650 y = 8.432 
x = 0.700 y = 8.433 
x = 0.750 y = 8.435 
x = 0.800 y = 8.436 
x = 0.850 y = 8.438 
x = 0.900 y = 8.439 
x = 0.950 y = 8.440 

まだあなたが望むものではありませんが、コーディングがはるかに簡単だと思います。

+0

Excelent、私はこの提案が好きです。コードを更新しました。事は結果が変わらないことです。たぶん私はエクセル関数を誤解しているのではなく、1E-13x6の代わりに1E-13 * x6というものがあります。 – 1000i1

+0

わからない。このコメントとその奇妙なタイムスタンプに関するあなたの考えは、自分が何をしているのかをより深く理解するためにExcelを深く掘り下げるべきだと私に示唆しています。そのような寒さがあるときにのみ、それをJavaに変換することができます。 – duffymo

+0

私はx = 0で試して、それが8.414であることを確認することをお勧めします。それが正しくないなら、他には何もありません。 –

関連する問題