鱼C论坛

 找回密码
 立即注册
查看: 2139|回复: 9

[已解决]求一个画圆,和正弦余弦的代码

[复制链接]
发表于 2023-7-19 02:43:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不要调用库函数,有计算方法的那种。
最佳答案
2023-7-19 03:10:55
画一个圆或者计算正弦和余弦函数的值可以通过使用特定的数学公式来完成。由于你不希望调用库函数,我们将使用基本的数学运算来计算这些值。我们需要借助到以下公式:

1. 单位圆的参数表示法: x = r * cos(theta) , y = r * sin(theta) ,这里r是半径,theta是角度。
2. 泰勒级数来计算sin和cos的值: sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ... , cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + ...

以下是在Python中画一个单位圆,并计算sin和cos值的示例代码:
# 定义一个函数用来计算阶乘def factorial(n):    if n == 0:        return 1    else:        return n * factorial(n-1)# 定义一个函数用来计算sin的值def sin(x):    sin_value = 0    for i in range(10):  # 用泰勒级数的前10项来近似sin的值        term = ((-1)**i)*(x**(2*i+1))/factorial(2*i+1)        sin_value += term    return sin_value# 定义一个函数用来计算cos的值def cos(x):    cos_value = 0    for i in range(10):  # 用泰勒级数的前10项来近似cos的值        term = ((-1)**i)*(x**(2*i))/factorial(2*i)        cos_value += term    return cos_value# 定义一个函数用来画圆def draw_circle(r):    for theta in range(0, 360):  # 角度从0到359        theta_radians = theta * 3.14159 / 180  # 将角度转换为弧度        x = r * cos(theta_radians)        y = r * sin(theta_radians)        print(f'({x}, {y})')  # 打印出所有的点draw_circle(1)  # 画一个单位圆
这个程序将会输出单位圆上的所有点。注意,我们在这个例子中将角度转换为了弧度,因为sin和cos的泰勒级数是以弧度为单位的。

值得注意的是,上述程序的sin和cos函数使用了泰勒级数的前10项来计算近似值,因此可能不如内建的math库函数精确。如果你需要更高的精度,可以增加泰勒级数的项数。然而,增加项数也会增加计算的复杂性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-19 03:10:55 | 显示全部楼层    本楼为最佳答案   
画一个圆或者计算正弦和余弦函数的值可以通过使用特定的数学公式来完成。由于你不希望调用库函数,我们将使用基本的数学运算来计算这些值。我们需要借助到以下公式:

1. 单位圆的参数表示法: x = r * cos(theta) , y = r * sin(theta) ,这里r是半径,theta是角度。
2. 泰勒级数来计算sin和cos的值: sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ... , cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + ...

以下是在Python中画一个单位圆,并计算sin和cos值的示例代码:
# 定义一个函数用来计算阶乘def factorial(n):    if n == 0:        return 1    else:        return n * factorial(n-1)# 定义一个函数用来计算sin的值def sin(x):    sin_value = 0    for i in range(10):  # 用泰勒级数的前10项来近似sin的值        term = ((-1)**i)*(x**(2*i+1))/factorial(2*i+1)        sin_value += term    return sin_value# 定义一个函数用来计算cos的值def cos(x):    cos_value = 0    for i in range(10):  # 用泰勒级数的前10项来近似cos的值        term = ((-1)**i)*(x**(2*i))/factorial(2*i)        cos_value += term    return cos_value# 定义一个函数用来画圆def draw_circle(r):    for theta in range(0, 360):  # 角度从0到359        theta_radians = theta * 3.14159 / 180  # 将角度转换为弧度        x = r * cos(theta_radians)        y = r * sin(theta_radians)        print(f'({x}, {y})')  # 打印出所有的点draw_circle(1)  # 画一个单位圆
这个程序将会输出单位圆上的所有点。注意,我们在这个例子中将角度转换为了弧度,因为sin和cos的泰勒级数是以弧度为单位的。

值得注意的是,上述程序的sin和cos函数使用了泰勒级数的前10项来计算近似值,因此可能不如内建的math库函数精确。如果你需要更高的精度,可以增加泰勒级数的项数。然而,增加项数也会增加计算的复杂性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 10:40:26 | 显示全部楼层
好的,下面是一个使用Python代码来画圆的例子:
import math

def draw_circle(radius):
    for i in range(radius*2+1):
        for j in range(radius*2+1):
            distance = math.sqrt((i-radius)**2 + (j-radius)**2)
            if math.isclose(distance, radius, rel_tol=1e-1):
                print("*", end="")
            else:
                print(" ", end="")
        print()

radius = 5
draw_circle(radius)

这段代码使用两层循环遍历整个画布,计算每个点与圆心的距离,如果距离与半径相等(使用math.isclose函数来判断),则认为该点在圆上并输出"*",否则输出空格。
关于正弦和余弦的计算方法,可以使用Taylor级数展开来计算。以下是一个使用Taylor级数展开计算正弦和余弦的示例代码:
import math

def compute_sine(x, num_terms=10):
    x = math.radians(x)
    result = 0
    for n in range(num_terms):
        coefficient = (-1)**n / math.factorial(2*n + 1)
        term = coefficient * x**(2*n + 1)
        result += term
    return result

def compute_cosine(x, num_terms=10):
    x = math.radians(x)
    result = 0
    for n in range(num_terms):
        coefficient = (-1)**n / math.factorial(2*n)
        term = coefficient * x**(2*n)
        result += term
    return result

angle = 45
sine_value = compute_sine(angle)
cosine_value = compute_cosine(angle)

print(f"Sine of {angle} degrees: {sine_value}")
print(f"Cosine of {angle} degrees: {cosine_value}")

这段代码中,compute_sine()函数使用Taylor级数展开来计算正弦值,compute_cosine()函数使用Taylor级数展开来计算余弦值。math.radians()函数用于将角度转换为弧度。num_terms参数表示要计算的级数项数目,你可以根据需要进行调整。
希望以上代码对你有帮助!如有其他问题,请随时提问。


注:此回答由 GPT 生成,其他类似回答也是 GPT 生成,仅供参考。如果遇到非 GPT 回答请优先采纳。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 11:52:50 | 显示全部楼层
画圆的思路:
- 使用turtle库,设置画笔的位置、颜色等参数。
- 调用turtle库的circle函数,设定半径,画出圆形。
正弦余弦的思路:
- 根据泰勒级数公式,使用for循环求出正弦余弦的近似值。
- 根据泰勒级数公式中的公式,求解每一项的系数和分母。
- 将每一项的结果相加,即可得到正弦余弦的近似值。画圆代码:
import turtle
def draw_circle(radius):
    turtle.penup()
    turtle.goto(0, -radius)
    turtle.pendown()
    turtle.circle(radius)
draw_circle(100)
turtle.done()

正弦余弦代码:
import math
def sin(x):
    result = 0
    for i in range(10):
        sign = (-1) ** i
        numerator = x ** (2 * i + 1)
        denominator = math.factorial(2 * i + 1)
        result += sign * numerator / denominator
    return result
def cos(x):
    result = 0
    for i in range(10):
        sign = (-1) ** i
        numerator = x ** (2 * i)
        denominator = math.factorial(2 * i)
        result += sign * numerator / denominator
    return result
print(sin(0))   # 0.0
print(sin(math.pi/2))   # 1.0
print(cos(0))   # 1.0
print(cos(math.pi/2))   # 0.0

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 12:28:05 | 显示全部楼层
智齿人类回帖,反对chatGPT

建议调用Python自带的math库,如果你不想调库,建议自己手算


                               
登录/注册后可看大图


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-19 20:55:54 | 显示全部楼层
本帖最后由 桃花飞舞 于 2023-7-20 00:12 编辑
isdkz 发表于 2023-7-19 03:10
画一个圆或者计算正弦和余弦函数的值可以通过使用特定的数学公式来完成。由于你不希望调用库函数,我们将使 ...


画出来圆形了。很好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 22:23:01 | 显示全部楼层
匠心巨制,求评分:https://fishc.com.cn/thread-231007-1-1.html
马上就能申请精华了,助把力吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-21 12:20:30 | 显示全部楼层
# 定义一个函数,计算给定角度的正弦值
def sin(angle):
    # 使用泰勒级数展开式近似计算正弦值
    # sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...
    # 为了提高精度,我们取前10项求和
    result = 0
    sign = 1 # 符号,正负交替
    for n in range(1, 20, 2):
        # 计算x^n
        power = 1
        for i in range(n):
            power *= angle
        # 计算n!
        factorial = 1
        for i in range(1, n+1):
            factorial *= i
        # 累加结果
        result += sign * power / factorial
        # 改变符号
        sign *= -1
    return result

# 定义一个函数,计算给定角度的余弦值
def cos(angle):
    # 使用泰勒级数展开式近似计算余弦值
    # cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + ...
    # 为了提高精度,我们取前10项求和
    result = 0
    sign = 1 # 符号,正负交替
    for n in range(0, 20, 2):
        # 计算x^n
        power = 1
        for i in range(n):
            power *= angle
        # 计算n!
        factorial = 1
        for i in range(1, n+1):
            factorial *= i
        # 累加结果
        result += sign * power / factorial
        # 改变符号
        sign *= -1
    return result

# 定义一个函数,画出一个圆形图案
def draw_circle(radius):
    # 使用极坐标方程画圆,即x = r*cos(theta), y = r*sin(theta)
    # 其中r是半径,theta是角度(弧度制)
    # 我们从0到2*pi,每隔0.01弧度取一个点,然后用*号表示在屏幕上
    for theta in range(0, 628): # 628约等于2*pi*100,因为我们要乘以100转换为整数
        theta /= 100 # 转换回弧度制
        x = radius * cos(theta) # 计算x坐标
        y = radius * sin(theta) # 计算y坐标
        print("*" * int(x + radius), end="") # 打印*号,注意要加上半径偏移量,因为屏幕左上角是原点
        print() # 换行

# 定义一个函数,画出正弦和余弦曲线图案
def draw_sine_cosine(period, amplitude):
    # 使用直角坐标方程画正弦和余弦曲线,即y = a*sin(b*x), y = a*cos(b*x)
    # 其中a是振幅,b是频率,x是横坐标,y是纵坐标
    # 我们从0到period,每隔0.01单位取一个点,然后用*号表示在屏幕上
    for x in range(0, int(period * 100)): # 因为我们要乘以100转换为整数
        x /= 100 # 转换回原来的单位
        y_sin = amplitude * sin(2 * 3.14 / period * x) # 计算正弦曲线的y坐标,注意要用弧度制转换角度
        y_cos = amplitude * cos(2 * 3.14 / period * x) # 计算余弦曲线的y坐标,注意要用弧度制转换角度
        print(" " * int(x * 10), end="") # 打印空格,注意要乘以10放大横坐标
        print("*" * int(y_sin + amplitude), end="") # 打印*号,注意要加上振幅偏移量,因为屏幕左上角是原点
        print("*" * int(y_cos + amplitude), end="") # 打印*号,注意要加上振幅偏移量,因为屏幕左上角是原点
        print() # 换行

# 调用函数,画出一个半径为10的圆
draw_circle(10)

# 调用函数,画出一个周期为5,振幅为10的正弦和余弦曲线
draw_sine_cosine(5, 10)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-22 00:16:23 | 显示全部楼层
本帖最后由 桃花飞舞 于 2023-7-22 00:27 编辑
StellarCoffee 发表于 2023-7-21 12:20
# 定义一个函数,计算给定角度的正弦值
def sin(angle):
    # 使用泰勒级数展开式近似计算正弦值


不知为什么正弦的图只有一个周期,余弦是半个周期,不过也能画出来就是了,没想到你们都会玩这个,圆形有点扁的,应该精度不够,不过也很好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-22 00:30:11 | 显示全部楼层
歌者文明清理员 发表于 2023-7-19 10:40
好的,下面是一个使用Python代码来画圆的例子:

我现在只能画点,代码里面没x,y座标。画不了点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 09:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表