• ベストアンサー

以下のプログラムを作るとすると・・・・・・?

プログラム作成の勉強をしているのですが、よく分かりません。お分かりの方、ぜひ教えてください。 log(1+x)=Σ_[M,n=1]{(-1)^(n+1)/n}・x^n M=∞ 上の式から有限なMの値とxの値を入力し、Do loopで第M項までの総和によりlog(1+x)の近似値を求め、組み込み関数logYの値と総和による近似解を求めた値の順でディスプレイ上に書き出すプログラムを作成するにはどうしたらよいでしょうか? どうかよろしくお願いします。(使っているツールはxemacsです。)

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

xemacs だと, 例えば print って関数で値を表示したり do ってスペシャルフォームで繰り返しができるので, 例えば (defun foo (M x) (print (log (1+ x))) (do ((n 1) (sum 0)) ((> n M) nil) (setq sum (+ sum (* (/ (expt -1.0 (1+ n)) n) (expt x n)))) (print sum) (incf n 1) ) ) というプログラムでいいはずです. これを *scratch* という名前のバッファ (xemacs を起動すると最初に現れます) に入力すると (最後の閉括弧のあとで C-j) , foo という関数が定義されます. そこで (foo 4 0.3) C-j を入力すると目的のものができるはず.... というのは, きっと答えにならないんだろ~な~.

Hayasumi
質問者

お礼

回答有難うございます。 *scratch*とか使った事のないバッファを使わないといけないのですね。知りませんでした。 もし、別解(*scratch*を使わないような)がありましたら、そちらも教えてはくれないでしょうか? よろしくお願いします。

関連するQ&A

  • このプログラムはどのように作成するのでしょうか?

    プログラム作成について勉強しているのですが、分からないのでぜひ教えていただきたいです。 整数Mと初期値X(0)の値を入力し、 X(n+1)=16807X(n) をN=Mまで計算しファイルX.dataに書き出すプログラムを作成 (X(n)は倍数度実数) 分かる方、ぜひご教授ください。

  • fortranのプログラムについて

    fortranでプログラムを作成する課題が出たのですが、やり方が全くわかりません。 何を使ってどういう順番で組めばよいか教えてください。 課題は以下のとおりです。 x^2+y^2<1を満たす領域の面積を、以下の方法で近似計算するプログラムを作成せよ。 はじめは、領域を0<x<1、0<y<1と設定し、x、y方向にそれぞれn等分に分割し、多数の正方形を用意する。 分割されたそれぞれの正方形の面積は、みな等しく1/n^2である。 各正方形の重心位置(xi,yj)は、 xi=1/2n+i/n i=0~n-1 yj=1/2n+j/n j=0~n-1 であらわされる。 個々の正方形について、その重心位置(xi,yj)が求めたい領域に含まれるかどうかを判断し、この総数から近似面積を求める。最後に、この値を4倍したもの(つまりx^2+y^2<1の近似面積)を出力することとする。 なお、i,j,nはinteger(8)で、x,y,求めたい面積等はreal(8)を用い、n=100000(nはread文で入力する形でよい)で計算することとする。 よろしくお願いします。

  • c プログラム 

    以下のプログラムは,第n項までのe^xのマクローリン展開をさせるものです. これを修正して,理論値と近似値の誤差がある値(自分で入力)になったときに,計算を終了させるにはどうしたらよいでしょうか.御教授いただければ幸甚 です. ---------------------------------------- #include <stdio.h> #include <math.h> int main(void) { int n; double x=1.0,y=1.0,e=1.0,err; int i; double f=1.0,p=1.0; printf("x="); scanf("%lf",&x); printf("n="); scanf("%d",&n); printf("Mclaurin展開によるn項までのexp(x)の\n n 理論値 近似値 誤差\n"); for(i=1;i<=n;i++){ f*=(double)i; p*=x; y+=p/f;近似値 e=exp(x);理論値 err=e-y;誤差 printf("%2d %12.8e %12.8e %12.8e\n",i,e,y,err); } return 0; }

  • 次式のような解像度変換のプログラムを作りたいのですが・・・

    以下のような低解像度作成の式があり それをプログラム化してみたのですがいまいちうまくいきません。 先生に式が誤りでないか聞いてみたのですが正しいと言われました。 どなたかプログラムのどの部分が間違っているかご指摘お願いします。 解像度変換の式は以下の通りです。 現画像{Xm,n}とし低解像度画像を{X'm,n}としたとき X'm,n=1/W^2 * Σ[k=0.W-1]Σ[l=0.W-1]    * X[(m+m0)/W]*W+k,[(n+n0)/W]*W+l となり、 式の添字mは縦方向nは横方向を表し、Wは解像度を何分の1にするかという値です(例えばW=5であれば解像度は5*5の25分の1になります) また、Σの中の[(m-m0)/W]と[(n-n0)/W]はガウス記号で少数以下切捨てです。 m0とn0の値は0~W-1の任意の値で これを変化させることで同じ解像度で異なる画像が作成できます。 現画像のサイズ256*256の濃淡画像、 読み込んだ現画像をoriginal[x][y]、 解像度変化後をhenka[x][y]として、 上式の部分の私の作ったプログラムは   int W = 34;//任意の値 int m0 =0;//任意の値 int n0 =0;//任意の値 int x,y; x = y = 0; float sum = 0f; float pixel = 0f; for(int m = 0; m < 256; m++){ for(int n = 0; n < 256; n++) { sum=0; for(int k = 0; k<W ; k++){ for(int l = 0; l<W ; l++){ x = (m+m0)/W; y = (n+n0)/W; x = x * W + k; y = y * W + l; pixel = original[x][y];// sum = sum + (pixel/W/W); } } henka[m][n] = sum; }   } となりました。 しかし実行してみると解像度は確かに変わるのですが W=10,m0=0,n0=0とした場合の結果と W=10,m0=10,n0=10とした場合を比べると 単に前者の結果画像が縦横に10画素ずつずれただけ という結果になりました。 長文になりましたがよろしくお願いしますm(__)m

    • ベストアンサー
    • Java
  • 収束S_(n+1)=S_n+log(a-S_n)

    S_1=log a として S_(n+1)=S_n+log(a-S_n) とすると {S_n}が収束することを示せという問題なのですが、 とき方としては、 まず問題文よりa>0またすべてのnにおいてa-(S_n)>0 これを変形してa>S_n よって、S_nは上に有界である。…(1) ここでf(x)=x-logxを考える(0<x) f '(x)=1-1/xであるためf(x)の最小値はf(1)=1であることがわかる。…(2) 任意のnに対し S_(n+1) =S_n+log(a-S_n) =S_n+log(a-S_(n-1)-log(a-S_(n-1)) Y=a-S_(n-1) とおいて代入すると =S_n+log(Y-logY) 2の結果より 1)Y≠1 log(Y-logY)>0になるので、すべてのnにおいてS(n+1)>S(n)となり、(1)とあわせ、数列は収束する 2)Y=1 log(Y-logY)=0になり、S_(n+1)=S_nとなる。この場合はすべての項が同じになる。 よって数列{S_n}は収束する 収束値LはL=L+log(a-L)⇔log(a-L)=1⇔L=a-1である。 で回答の方針はあってますか?何か間違いがあったら指摘お願いします。まったく見当違いな解答でしたら、正しいやり方のヒントお願いします。

  • プログラムについてですが・・・

    今、画像処理の最小二乗法のプログラムを作成しているのですが、どうも上手く出力されません。以下のプログラムが、メインのプログラムでして、余分な #include は気にしないでください。画像の表示自体のプログラムは特に問題はありませんでしたので省きました。このプログラムにどんな問題があるか、わかりません。どなたか教えてください。 お願いします。 #include <math.h> #include <windows.h> #include <commdlg.h> #include <memory.h> #include <dos.h> #include <time.h> #include <wchar.h> #include <stdio.h> #include <iostream.h> #include "../DibFile.h" #include "ImageSDK.h" int n,n4,n5,n6,n7,n8,n9 ; double n10,n11 ; int n0[1000],n1[1000],n2[1000],n3[1000] ; n = 0 ; for(y = 0 ; y < h ; y++){   for(x = 0 ; x < w ; x++){ i = x+y*w ; if( *(buff1+i) == 0x00 ){                n0[n] = x ;                n1[n] = y ;                n2[n] = x*x ;                n3[n] = x*y ;                ++n ; } } } n5 = 0 ; n6 = 0 ; n7 = 0 ; n8 = 0 ; n9 = 0 ; for(n4 = 0 ; n4 < n ; n4++){ n5 += n2[n4] ; n6 += n0[n4] ; ++n7 ; n8 += n3[n4] ; n9 += n1[n4] ; } if((n6*n6-n7*n5) != 0){  n10 = ((n9*n6)-(n7*n8)) / ((n6*n6)-(n7*n5)) ;  n11 = (n8-(n5*n10)) / n6 ; for(x = 0 ; x < w ; x++){   y = (int) (n10*x+n11) ;    if(y < h && y > 0){  *(buff1+(x+y*w)) = 0x80 ;    } }

  • プログラムの勉強をしているのですが・・・・・・

    以下のプログラムを組もうとしているのですが、ある所から分からなくなりました。ぜひ、教えてください。 配列x(1)=3, x(2)=10, x(3)=4, x(4)=4, x(5)= 1 の最大値と最小値平均値を計算する関数副プログラムmaxmin( x, N, xmax, xmin, xave)を作る。  integer x(5) N=5 x(1)=3 …   ←省略 call maxmin( x, N, xmax, xmin, xave) write(6,*) “max=", xmax write(6,*) “min=“, xmin write(6,*) “xave=“, xave end subroutine maxxmin(x,N,xmax,xmin,xave) ここから先が分かりません。どうしたら良いのでしょうか? 分かる方、ぜひ教えてください。 よろしくお願いします。 ちなみに使ってるエディタはxemacsです。

  • プログラムの作成

    Cで、キ-ボ-ドから整数を1個(mとする)、実数を1個(xとする)それぞれ入力し、 S=Σ(n=0からmまで)1/2n+1×(x-1/x+1)^2n+1 の値を求めるプログラムを作ってみたのですが、あってるかどうかわかりますか? #include<stdio.h> #include<math.h> main() { double y=0; int i,m,x; printf(\" Input m: \") scanf(\"%lf\", &m); printf(\" Input x: \") scanf(\"%lf\", &x); for(i=0; i <= m; i++) { y += 1/(2*i+1)*pow((x-1)/(x+1),2*i+1) } printf(\" S = %d\n\", y) }

  • 有限積が指数関数に近似される

    文献を読んでいたところ、以下のような有限積を指数関数に近似できるとの記述があったのですが、どのようにして導き出されたのか分かりません。 ((2^n-1)-(2^i-1))/((2^n-1)-i) これのi=0からm-1までの積が、m<nのとき 1-exp(-2^(m-n)) と近似できると記述されていました。 ヒントのようなものでも構いません。よろしくお願いします。

  • C言語プログラム(二分法)について質問です。

    C言語プログラム(二分法)について質問です。 以下作成したプログラムでは、aを入力すると, x=b - (log(a)) - (a+x)/2の解が求まります。(今回式は適当ですが。) 二分法で解を求めるというプログラムは作成できたのですが、 このプログラムで、aを1~10まで変化させたときのxの値というようなループをプログラムでしたうえで、 a*xの値がもっとも大い点を求めるためにはどのようなプログラムを組めば(これを改良すれば)いいのでしょうか? 具体的に行いたいことは、この二分法のプログラムをaとxの関数とし、a*xの最大点を求めたいのです。 質問が分かりにくいかもしれませんが、お願いします。 以下作成したプログラムです。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define eps 1.0e-6 double b=0.3; double a=0; double f(double x); void nibun(void); int main() { nibun(); return 0; } void nibun(void) { int count; double x0,x1,m; printf("aの値\n"); scanf("%lf",&a); count=0; x0=-2*b; x1=b; do { count++; m=(x0+x1)/2.0; if(f(m)*f(x0)<0) x1=m; else x0=m; if(count==700) { printf("Error\n"); exit(1); } } while (!(fabs(x0-x1)<eps)); printf("解の値は %f\n",m); } double f(double x) { return(b - (log(a)) - (a+x)/2); }

専門家に質問してみよう