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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

246閲覧

丸め込み誤差を減少させる方法

linkinpark

総合スコア42

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/13 09:03

今自作の関数を作っているのですが、上記のようにおそらく丸め込み誤差によってグラフがギザギザになってしまっています。for文のrangeを(4,52,4)とすれば滑らかなグラフとなるのですが、
N_5GとN_Wを他の値に変えた時と比較したいのでfor文のrangeを変更したくありません。グラフを滑らかにするためにグラフを近似する以外の何らかの手法やサイトなどを教えて頂けると幸いです。よろしくお願い致します。

イメージ説明

Python

1コード 2import random 3import math### 4 5nCr = {} 6def comb(n, r):#コンビネーションを計算する関数 7 if r == 0 or r == n: return 1 8 if r == 1: return n 9 if (n,r) in nCr: return nCr[(n,r)] 10 nCr[(n,r)] = comb(n-1,r) + comb(n-1,r-1) 11 return nCr[(n,r)] 12 13 14def Judge(P1,P2):#与えられた確率に応じてユーザーが1,0どちらになるのかを判定する 15 j=random.randint(0,100)%10/10 16 if(P1>j): 17 if(P2>j): 18 return(1,1) 19 else: 20 return(1,0) 21 else: 22 if(P2>j): 23 return(0,1) 24 else: 25 return(0,0) 26 27 28def C_C(P_5G,P_W,q_C,q_W): 29 Y_5G,Y_W=Judge(P_5G,P_W) 30 if(Y_5G==1): 31 if(Y_W==1): 32 return (1-(1-q_C)*q_W) 33 else: 34 return (1-(1-q_C)*(1-q_W)) 35 else: 36 if(Y_W==1): 37 return (1-q_C*q_W) 38 else: 39 return (1-q_C*(1-q_W)) 40 41def W_C(P_5G,P_W,q_C,q_W): 42 Y_5G,Y_W=Judge(P_5G,P_W) 43 if(Y_5G==1): 44 if(Y_W==1): 45 return q_C*(1-q_W) 46 else: 47 return q_W*q_C 48 else: 49 if(Y_W==1): 50 return (1-q_C)*(1-q_W) 51 else: 52 return (1-q_C)*q_W 53 54def Result_cellular(N_5G,N_W,P_5G,P_W,q_C,q_W): 55 N=N_5G+N_W 56 sum=0 57 k=max(0,(N+1)/2-N_W) 58 C=C_C(P_5G,P_W,q_C,q_W) 59 W=W_C(P_5G,P_W,q_C,q_W) 60 for i in range(int(k),N_5G+1): 61 l=max(0,(N+1)/2-i) 62 for j in range(int(l),N_W+1): 63 s1=comb(N_5G,i)*comb(N_W,j) 64 s2=pow(C,i)*pow((1-C),N_5G-i) 65 s3=pow(W,j)*pow((1-W),N_W-j) 66 sum+=s1*s2*s3 67 return (sum) 68 69def P_error(P_5G,P_W,c1,c2): 70 s1=P_5G*(1-P_W)*(1-c1) 71 s2=(1-P_5G)*P_W*c2 72 s3=P_5G*(1-P_W)+(1-P_5G)*P_W 73 return ((s1+s2)/s3) 74 75 76P_5G=0.6 77P_W=0.8 78P_4G=1 79q_C=0.6 80q_W=0.8 81 82 83for i in range(3,53,2): 84 N_5G=int(math.ceil(0.25*i)) 85 N_W=int(math.ceil(0.75*i)) 86 c1=Result_cellular(N_5G,N_W,1,0,q_C,q_W) 87 c2=Result_cellular(N_5G,N_W,0,1,q_C,q_W) 88 print(i,P_error(P_5G,P_W,c1,c2)) 89

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

例えば gnuplot の場合、ベジエ曲線で補間することができます。

gnuplot

1plot 'output.dat' smooth bezier

bezier

投稿2021/12/13 09:31

編集2021/12/13 09:38
melian

総合スコア19825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問