• 締切済み

Rubyプログラムの質問です

Rubyプログラムの質問です。 y = ax^3 + bx^2 + cx + d という関数が与えられていて、 整数a,b,c,dを読み込んで、xが0から1まで0.1刻みでyの値を求め、印字するプログラムを作っています。 そして、この中でyの値が最小・最大となるときのx,yの値を出力したいのですが、どう求めればよいのかわかりません。 まずxを0から1まで0.1刻みで出力するのはstepを使って 0.step(10,0.1){ |x| print( x,"\n" ) まではわかりました。 その出力したxをどのように関数の式に代入するのかがわかりません。 そして最小値・最大値を求める問題ですが、最小値を記憶して、次の要素より小さければ交換という 形でいこうと思っているのですが、これもどのようにすればよいのかはっきりわかりません。 loopを使うということは何となく想像がつきます。 たとえばこのようにしても大丈夫なのでしょうか? for( i=1;i<100;i++ ){ if( a[0] < a[i] ){ work = a[0]; a[0] = a[i] a[i] = work; } } どなたかご教示いただければ幸いです。

みんなの回答

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.3

ついでなので・・・ 話にちょっと出てきていた 「最大値・最小値を記憶しておいて、それを振りきる物が出てきたら差し替える」 に書き直すとこうなります。 http://ideone.com/0LmiA

全文を見る
すると、全ての回答が全文表示されます。
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.2

yの最大・最小出す際にxも併せて出力するようにしたと思うのですが、何か認識ちがいましたでしょうか? <おまけ> 自分でも冗長だと思うのですが、少し書き方を変えたものも貼っておきます http://ideone.com/U7Nnl <おまけのおまけ> 更に冗長なコメント付与版はこちら http://ideone.com/DE7n6

全文を見る
すると、全ての回答が全文表示されます。
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.1

まず、返された回答へちゃんと返信をつけましょう。 特に、今回は同じ件についてですよね? http://okwave.jp/qa/q6816209.html <代入について> これはもう、単に関数なりなんなりつくっておいて渡してやれば良いだけです。 <配列の要素交換> i++といったインクリメントは使えませんが、そういった代入記法で配列の順番差し替えは可能です。 更に挙げれば、このような書き方も可能です。 http://ideone.com/a9jDW ただ、q6816209でも挙げられているように、maxやmax_byといったメソッドを使ったほうが良いと考えます。 組み込みで丁度良いメソッドがあるのなら、余程特別な理由がない限りそれを使ったほうが良いでしょう。 <おまけ> 意図があってる自信全然無いんですが・・・大体こう言うことで良いんですかね? http://ideone.com/Jgmkn ※Rubyでべき乗を表す演算子は「**」です。

lalala10
質問者

補足

回答ありがとうございました。 まだ使い始めで勝手が十分理解できておらず、申し訳ありません。 さて、yの値を出力して、最大値、最小値の値を求めることができましたが、 そのときのxの値も最終的に求めなければなりません。 これはどのようにすればよいのでしょうか。 回答よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Rubyプログラムの質問です

    y = ax^3 + bx^2 + cx + d という関数が与えられていて、 整数a,b,c,dを読み込んで、xが0から1まで0.1刻みでyの値を求め、yの値の最大値、最小値を求めるところまではできているのですが、さらに最大値・最小値となるときのxの値も求めなければならないのですが、これはどのようにしたら求められるかご存じの方がいらっしゃいましたら、ご教示いただければ幸いです。よろしくお願いいたします。

  • Rubyの質問です

    (1)Rubyプログラムの質問です。 y = ax^3 + bx^2 + cx + d 整数a,b,c,dを読み込んで、xが0から1まで0.1刻みでyの値を求め、印字するプログラムを作っています。 そして、この中でyの値が最小・最大となるときのx,yの値を出力したいのですが、どう求めればよいのかわかりません。 どなたかご教示いただければ幸いです。 (2)もう一つありまして、これもRubyプログラムに関してです。 exp(1) = 1 + 1/1! + 1/2! + ・・・ + 1/n! + ・・・ですが、 この近似式よりexp(1)の値を求めるプログラムの作成の仕方で悩んでいます。 さらにn = 1,2,3・・・10として、近似式を求めるプログラムを作りたいのです。 この問題に関しても、ご存じの方いらっしゃいましたら、ご教示ください。

  • 数学のご質問

    2次関数y=x^2-2ax+b+5……I(a、bは定数であり、a>0)のグラフが点(-2、16)を通っている。 (1)関数Iのグラフがx軸と接するとき、aの値を求めよ。 (2)(1)の時、0≦x≦k(kは正の定数)における最大値と最小値の我が5となるようなkの値を求めよ。 わからなくて、困っています。お願いします。

  • 2次関数で分からないのがあるため教えてください。

    (1)2次関数y=x^2-2x+a (0≦x≦4)の最大値が10であるとき、定数aの値を求めてください。また、このときの最小値を求めてください。 (2)a≧0のとき、2次関数y=x^2-2ax+1 (0≦x≦2)の最小値を求めてください。 (3)関数y=ax^2+2ax+b (-2≦x≦1)の最大値が6、最小値が2となるように、定数a、bの値を求めてください。 ちなみに答えは、 (1)a=2;最小値1(x=1) (2)0≦a<2のとき最小値-a^2+1 a≧2のとき最小値-4a+5 (3)(a、b)=(1、3)、(-1、5) です

  • C言語のプログラムを見てください

    ある100行の値がx列、y列の2列あるファイルを読み込んでそれを配列に入れ、yの最小値及びそれと同じ行にあるxの値を表示するプログラムを書きたいのですがy列の最小値を表示するプログラムを書き終えた所でコンパイルして実行してみると正しく値が表示されませんでした。それどころか実行するたびに値が変わってしまいます。どこがおかしいのかわからないため、ご指摘のほどよろしくお願いします。また、できれば同じ行にあるx列の値も表示させるプログラムを教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define N 100 int main(void) { int x[N],i; double y[N],min; FILE *fp; fp=fopen("book.dat","r"); if(fp==NULL){ puts("can't open file!"); exit(-1); } for(i=0;i<N;i++){ fscanf(fp,"%d %lf", &x[N],&y[N]); printf("x=%d\n y=%lf\n",x[N],y[N]); } min=y[0]; for(i=1;i<N;i++){ if(y[i]<min) min=y[i]; } fclose(fp); printf("最小値:%lf\n",min); return 0; }

  • 数Iの質問です・・・

    関数の最大値と最小値とそれを与えるXの値を求める問題なんですが、 y=(xの2乗)分の2+xの2乗+4 ↑の最大値最小値を求めるにはどうしたらいいんですか? まったく分からないのでできれば途中式もお願いします

  • 教えて下さい。

    -2≦x≦2のとき、関数y=9^x-6・3^x+1の最大と最小、その時のxの値について。。。 y=9^x-6・3^x+1 =(3^x)^2-6・3^x+1 =A^2-6A+1 =(A-3)^2-8 からわかりません。。。 そして-1≦x≦2のとき、関数y=-4^x+2^x+1+2の最大と最小その時のxについてで、2^x=Aとおくとき(2^x+1)はどうやって書きかえるんですか?? 教えて下さい。。。

  • 二次関数の最大、最小の問題教えてください((+_+))

    二次関数の最大、最小の問題教えてください((+_+)) (1)Y=x^2+2axの最小値が-9であるように定数aの値を求めよ。またこのとき最小値を与えるxの値を求めよ 二次関数の決定の問題です (2)x=-2のとき最大値5をとりx=-1のときY=0となる (3)x=3のとき最小値をとり2点(0,5)、(5,0)を通る二次関数を求めよ (4)放物線Y=2x^2-8x+9の頂点と同じであり点(0,5)を通る二次関数を求めよ (5)二次関数のぐらふがx軸と2点(-2,0)、(1,0)で交わり点(0,-4)を通る時その関数をもとめよ この問題わからないのでわかるかた求め方も一緒に教えてください

  • 代数の質問です。

    家でZ会の数学アドバンストを使っています。 そこで次の問題が分からないのでお答えください。不等式を使う解き方でお願いします。問題をそのまま写しているので間違いはないです。 ※xはエックスです。 (1)0≦2x-y≦3、-1≦3x-2y≦2のとき、xとyそれぞれの最大値、最小値を求めよ。 (2)1≦x≦a、-1≦y≦bのとき、2x-3yの最大値は9、最小値は-4である。このとき、a,bの値を求 めよ。また、2y-3xの値の範囲を不等式で表せ。 答えは、(1)はxが最大値7、最小値-2です。yは最大値が11、最小値が-4です。(2)はa=3、b=2 、-11≦2y-3x≦1です。 中1なので詳しい解説がほしいです。 また、先の質問にも投稿があったので改めて書いておきますが、一生懸命考えて分からなかったのです。

  • 関数の積分を求めるプログラムで質問です。

    シンプソンの公式を用いて積分を求めるプログラムで、 「 y=1/(1+x*x) のように±∞で0に収束するような関数は以下のような無限積分を求めることができる。 ∫(-∞→∞){1/(1+x*x)}dx …(a) ただし、無限区間を分割することはできないので、コンピュータを用いた計算では ∫(-a→a){1/(1+x*x)}dx のaに大きな値を入れることで代用する。この積分を求めるプログラムをシンプソンの式を用いて作成し、以下の3ケースについて値を求めて真値と比較せよ。真値は式(a)を解析的に積分することで求めよ。 ・a=100、N=1000 ・a=100、N=500 ・a=200、N=1000 (Nは以下のプログラムと対応しているものです) 」 というもので参考としてS=∫(1→2){1/x}dxをシンプソンの公式を使い求めるものは以下のものなのですが #include <stdio.h> double f(double x) { return 1/x; } int main() { int i,N; double a,b,h,S; double x[1000],y[1000]; a=1.0; b=2.0; N=10; h=(b-a)/N; for(i=0;i<=N;i++) x[i]=a+i*h; y[0]=f(x[0]); y[N]=f(x[N]); S=h*(y[0]+y[N])/3.0; for(i=1;i<=N-1;i=i+2) { y[i]=f(x[i]); S=S+h*y[i]*4.0/3.0; } for(i=2;i<=N-2;i=i+2) { y[i]=f(x[i]); S=S+h*y[i]*2.0/3.0; } printf("N=%d,S=%15.10lf\n",N,S); } これを生かしてプリグラムをつくりたいのですが、分からなくて困っています。助けてください。