質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.90%

配列を関数に初期化する方法

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 993
退会済みユーザー

退会済みユーザー

Javaで、配列 double []u を Math.Sin(Math.PI*x) に初期化する方法がわかりません。教えていただける方お願いします。

調べてたり何度試したりしましたが、今のところ各u=0.0;となります。

非定常1次元熱方程式の数値解を求めるための問題で、uを初期化したいです。

∂u/∂t - ∂^2 u/∂x^2 = 0, 
(x,t) ∈ (0,1)×(0,T), 
u(0,t) = u(1,t) =0,  t∈(0,T), 
u(x,0) = sinπx,  x∈(0,

static public void main(String[] args){

    double a = 0.0; double b = 1.0;
    int M = 10;
    double dx = (b-a)/(double)M;
    double T = 1.0;
    double t = 0.0;
    double x = 0.0;
    double dt = 0.5*dx*dx;
    double err= 0.0;
    int N = (int)(T/dt);

    double ua = 0.0; double ub = 0.0;
    double []u = new double[M+1];
    double []v = new double[M+1];

for(int j=0; j<M+1; j++){
    u[j]=Math.sin(Math.PI*x);
}
    for (int k=0; k<N+1; k++){
        for (int j=0; j<M-1; j++){
        x = x + dx*((double)j);
        v[j+1] = u[j+1] + (u[j+2] - 2*u[j+1] + u[j])*100*0.005;
        t = t + dt;
            }
        u = v;
for (int j=0; j<M+1; j++){
                if (k == 5*(int)(k/5)){
        System.out.println(" t = "+t+", u["+j+"]= "+u[j]);
        }

        if(err < Math.abs(u[j] - exact(t,x))){
        err= Math.abs(u[j] - exact(t,x));
        System.out.println(" Error = "+err);
        }
}

    }
    }

    public static double exact(double t, double x){
    double exact;
    exact = Math.exp(-Math.PI*Math.PI*t)* Math.sin(Math.PI*x);
    return exact;
    }
}

1).

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otn

    2016/08/11 05:39

    タグが間違ってますね。JavaScript C C++ いずれも関係ないです。Javaが抜けてます。

    キャンセル

  • asahina_dev

    2016/08/11 07:05

    JavaFX も関係ないです。

    キャンセル

  • think49

    2016/08/11 11:30

    otnさんの繰り返しになりますが、JavaScript タグは関係ないですね。

    キャンセル

回答 3

checkベストアンサー

0

配列 double []u を Math.Sin(Math.PI*x) に初期化する方法がわかりません。

出来てますよ。ただ、あなたの意図とは多分違います:

for(int j=0; j<M+1; j++){
    u[j]=Math.sin(Math.PI*x); // xがjの値によらず常に0
}

ついでに:

x = x + dx*((double)j); // x = 0, dx, 3dx, 6dx, ...

あとインデントがめちゃくちゃで読みづらいです。
読みづらいとバグを呼びますよ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/11 13:06

    ご教授ありがとうございます。すみません!できました!ありがとうございます。

    キャンセル

0

確保した配列の範囲を超えている(11番目にアクセスしている?)ようですが・・・
インデックスあっていますか? ソースを提示された方が回答が得られやすいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/11 19:21

    "調べてたり何度試したりしましたが、Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11が出ます。"という投稿は何処へ行ったんでしょう?・・・これでは私の回答の意味が分からなくなりますが^^;

    キャンセル

0

Java8のStreamを使うのならば…

for(int j=0; j<M+1; j++){
    u[j]=Math.sin(Math.PI*x);
}


の部分を

u = Arrays.stream(u).map(d -> d * Math.PI).toArray();

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る