File size: 11,055 Bytes
b8e59d0
75e35dc
1c0f3af
b8e59d0
 
a1f8e00
 
b8e59d0
 
75e35dc
4a41665
ee7bc1b
b8e59d0
06ac063
 
38c5378
 
 
b8e59d0
d4e53f1
06ac063
38c5378
d4e53f1
 
 
 
 
 
 
 
0b015a2
585b030
b8e59d0
 
 
585b030
b8e59d0
 
585b030
541f0c9
 
 
b8e59d0
78ec0d9
585b030
b8e59d0
 
 
 
 
 
75e35dc
b8e59d0
 
 
 
 
a8ca93d
b8e59d0
 
 
 
 
 
 
a8ca93d
b8e59d0
 
 
 
 
 
 
 
23ca843
b8e59d0
a8ca93d
b8e59d0
 
 
 
 
 
 
 
 
 
a8ca93d
b8e59d0
 
 
 
 
 
 
 
8af1c72
b8e59d0
 
 
 
 
 
 
 
a8ca93d
b8e59d0
 
 
 
 
 
 
 
 
 
a8ca93d
b8e59d0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a8ca93d
8af1c72
 
b8e59d0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0b015a2
 
 
 
 
 
a028e0c
a8ca93d
1c0f3af
 
 
 
a028e0c
1c0f3af
a8ca93d
1c0f3af
a1f8e00
8ebee40
90f1528
6ee71a6
a1f8e00
e323759
a1f8e00
8ebee40
a1f8e00
 
6ee71a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90f1528
6ee71a6
 
 
 
 
 
 
90f1528
 
 
 
6ee71a6
90f1528
6ee71a6
a1f8e00
6ee71a6
e323759
62acbe3
e323759
 
 
 
 
 
 
 
 
 
c2d709e
 
ce573f4
 
25e1cc5
4828e6c
9671fed
 
4828e6c
 
25e1cc5
4828e6c
ffd7cb3
8e66ad5
56d4d78
56ebacd
6ee71a6
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# 必要なライブラリをインポート
import streamlit as st
from sympy import symbols, expand, factor, Eq, solve, diff, N, simplify, factorial, parse_expr, sqrt
import math
from scipy.optimize import fsolve
import numpy as np
import random
# Streamlitアプリのタイトルを設定
st.title("数学関数アプリ")

selected_function = st.sidebar.selectbox("機能を選択", ["因数分解", "展開", "方程式", "連立方程式", "nPm", "nCm", "多項式への代入計算", "関数の交点", "三平方の定理", "素因数分解", "普通の記述式計算","問題生成"])
x=symbols("x")
# サイドバーに説明を追加
st.sidebar.header("構文説明")
st.sidebar.markdown("$2x$と書きたい場合は「$2*x$」と、記述するように。また、平方根は$sqrt(2)$というように記述するように。")
st.sidebar.markdown("また、平方根は$sqrt(2)$というように記述するように。")
st.sidebar.markdown("割り算は`/`を使うように。掛け算は`*`を使うように。")
st.sidebar.markdown("--------------")
st.sidebar.header("機能説明")
st.sidebar.markdown("## 因数分解(2x=2*x)")
st.sidebar.markdown("## (2x=2*x)")
#st.sidebar.markdown("$2x$と書きたい場合は「$2*x$」と、きじゅつするように。")
st.sidebar.markdown("## 方程式(2x=2*x)")
st.sidebar.markdown("## 連立方程式(2x=2*x)")
st.sidebar.markdown("## nPm, nCm")
st.sidebar.markdown("## 多項式への代入計算")
st.sidebar.markdown("## ふたつの関数の交点の計算")
st.sidebar.markdown("## 三平方の定理(空欄補充)")
st.sidebar.markdown("## 素因数分解(Sympy)")
st.sidebar.markdown("## 記述式計算")


# Symbolの定義
#user_defined_symbol= symbols("x")
#user_defined_symbol = st.sidebar.text_input("Symbolを定義してください(カンマ区切り):")

# カンマ区切りで複数のSymbolを作成
#user_defined_symbols = symbols(user_defined_symbol.replace(" ", "").split(","))




# メインのコンテンツを作成


# 因数分解
if selected_function == "因数分解":
    expression = st.text_input("因数分解する式を入力してください:")
    if expression:
        x = symbols('x')
        factored_expression = factor(expression)

        # シンボルの代入
        #for symbol in user_defined_symbols:
#        factored_expression = factor(expression)

        st.success(f"因数分解結果: {factored_expression}")
        st.latex(factored_expression)

# 展開(Sympy)
elif selected_function == "展開":
    expression = st.text_input("展開する式を入力してください:")
    if expression:
        result = expand(expression)
        st.success(f"展開結果: {result}")
        st.latex(result)

# 方程式(Sympy)
# 方程式(Sympy)
# 方程式(Sympy)
elif selected_function == "方程式":
    equation = st.text_input("解きたい方程式を入力してください:")
    if equation:
        x = symbols('x', real=True)
        solution = solve(Eq(eval(equation),0), x)
        st.success(f"方程式の解: {solution}")
        st.latex(solution)


# 連立方程式(Sympy)
elif selected_function == "連立方程式":
    eq1 = st.text_input("1つ目の方程式を入力してください:")
    eq2 = st.text_input("2つ目の方程式を入力してください:")
    if eq1 and eq2:
        x, y = symbols('x y', real=True)
        solution = solve([Eq(eval(eq1), 0), Eq(eval(eq2), 0)], (x, y))
        st.success(f"連立方程式の解: {solution}")
        st.latex(solution)

# nPm
elif selected_function == "nPm":
    n = st.number_input("nを入力してください:", min_value=0, step=1)
    m = st.number_input("mを入力してください:", min_value=0, step=1)
    if n >= m:
        result = factorial(n) / factorial(n - m)
        st.success(f"{n}P{m}の結果: {result}")
        

# nCm
elif selected_function == "nCm":
    n = st.number_input("nを入力してください:", min_value=0, step=1)
    m = st.number_input("mを入力してください:", min_value=0, step=1)
    if n >= m:
        result = math.comb(n, m)
        st.success(f"{n}C{m}の結果: {result}")
        st.latex(result)

# 多項式への代入計算
elif selected_function == "多項式への代入計算":
    poly_expression = st.text_input("多項式を入力してください:")
    value_to_substitute = st.number_input("代入する値を入力してください:")
    if poly_expression:
        x = symbols('x', real=True)
        poly = simplify(poly_expression)
        result = poly.subs(x, value_to_substitute)
        st.success(f"代入計算の結果: {result}")
        st.latex(result)

# ふたつの関数の交点の計算
elif selected_function == "関数の交点":
    func1_expression = st.text_input("1つ目の関数を入力してください:")
    func2_expression = st.text_input("2つ目の関数を入力してください:")
    if func1_expression and func2_expression:
        x = symbols('x', real=True)
        func1 = simplify(parse_expr(func1_expression))
        func2 = simplify(parse_expr(func2_expression))

        # 関数を数値的に解くためのラムダ関数
        equation_system = lambda x: [func1.subs('x', x[0]) - func2.subs('x', x[0]),
                                     func1.subs('x', x[1]) - func2.subs('x', x[1])]

        # 初期値の設定
        initial_guess = [0, 0]

        # fsolveを使用して交点を求める
        intersection_points = fsolve(equation_system, initial_guess)

        st.success(f"関数の交点の座標: {tuple(intersection_points)}")
        st.latex(tuple(intersection_points))




# 三平方の定理(空欄補充)
elif selected_function == "三平方の定理":
    case = st.radio("三平方の定理のケースを選択してください:", ["Case1", "Case2", "Case3"])

    if case == "Case1":
        a = st.number_input("aの値を入力してください:")
        b = st.number_input("bの値を入力してください:")
        c_squared = a**2 + b**2
        st.success(f"三平方の定理の結果: a^2 + b^2 = c^2,  c^2 = {c_squared}")

    elif case == "Case2":
        a = st.number_input("aの値を入力してください:")
        c = st.number_input("cの値を入力してください:")
        b_squared = c**2 - a**2
        if b_squared >= 0:
            b = b_squared**0.5
            st.success(f"三平方の定理の結果: a^2 + b^2 = c^2,  b^2 = {b_squared},  b = {b}")
        else:
            st.error("無効な値です。b^2は負になりません。")

    elif case == "Case3":
        b = st.number_input("bの値を入力してください:")
        c = st.number_input("cの値を入力してください:")
        a_squared = c**2 - b**2
        if a_squared >= 0:
            a = a_squared**0.5
            st.success(f"三平方の定理の結果: a^2 + b^2 = c^2,  a^2 = {a_squared},  a = {a}")
        else:
            st.error("無効な値です。a^2は負になりません。")
# 素因数分解(Sympy)
elif selected_function == "素因数分解":
    expression = st.text_input("素因数分解する式を入力してください:")
    if expression:
        factored_expression = factor(expression)
        st.success(f"素因数分解結果: {factored_expression}")
        st.latex(factored_expression)
elif selected_function == "普通の記述式計算":
    expression = st.text_input("計算したい数式を入力してください:")
    if expression:
        try:
            result = parse_expr(expression)
            st.success(f"計算結果: {result}")
            st.latex(result)
        except Exception as e:
            st.error(f"エラー: {e}")
# 問題生成
# 問題生成
# 問題生成
elif selected_function == "問題生成":
    problem_option = st.radio("問題オプションを選択してください:", ["四則演算", "因数分解", "方程式","ヘロンの公式"])

    if not problem_option:
        st.warning("少なくとも1つの問題オプションを選択してください。")
    else:
        # 乱数の生成範囲指定
        min_value = st.number_input("乱数の最小値を入力してください:", value=-10)
        max_value = st.number_input("乱数の最大値を入力してください:", value=10)

        # 生成ボタン
        generate_button = st.button("問題を生成する")

        if generate_button:
            generated_problems = []

            # 四則演算の問題生成
            if problem_option == "四則演算":
                # 例: 3 + 5 * 2
                num1 = random.randint(min_value, max_value)
                num2 = random.randint(min_value, max_value)
                operator = random.choice(["+", "-", "*", "/"])
                problem = f"{num1} {operator} {num2}"
                generated_problems.append(problem)

            # 因数分解の問題生成
            elif problem_option == "因数分解":
                # 例: x**2 + 5*x + 6
                a = random.randint(min_value, max_value)
                b = random.randint(min_value, max_value)
                init_problem = f"(x + {a})*(x + {b})"
                expression = init_problem
                if expression:
                    result = expand(expression)
                    st.success(f"問題: {result}")
                    st.latex(result)
                generated_problems.append(result)

            # 方程式の問題生成
            elif problem_option == "ヘロンの公式":
                from sympy import sqrt
                # 一辺の長さが2の倍数になる正三角形
                st.caption("負の数を乱数に入れても意味はないですよ...")
                side_length = random.randint(abs(min_value), abs(max_value)) * 2
                # ヘロンの公式: s = (a + b + c) / 2
                s = side_length * 3 / 2
                # 三角形の面積
                area = math.sqrt(s * (s - side_length) ** 3)
                problem = f"一辺の長さが{side_length}の正三角形の面積"
                generated_problems.append(problem)
                st.success(f"問題: {problem}")
                acr = "{"
                acrE="}"
                ReProblem =f"sqrt({s} * ({s} - {side_length}) * ({s} - {side_length}) * ({s} - {side_length}))"
                ReProblem=str(ReProblem)
                #ReProblem =equation# =# "sqrt({s}*({s}-{side_length})*({s}-{side_length})*({s}-{side_length}))"
                
            #equation = equation.replace("{sidelength}", str(side_length))
              #  #equation = equation.replace("{s}", str(s))


                #ReProblem = equation

                st.latex(ReProblem)
                st.latex("sqrt(30.0∗(30.0−20)∗(30.0−20)∗(30.0−20))")
                st.markdown(f"${ReProblem}$")
                
            st.success("生成された問題:")
            for idx, problem in enumerate(generated_problems, start=1):
                st.write(f"{idx}. {problem}")