鱼C论坛

 找回密码
 立即注册
查看: 1804|回复: 16

[已解决]函数图像

[复制链接]
发表于 2023-12-30 17:49:54 | 显示全部楼层 |阅读模式

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

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

x
编程实现:
输入函数表达式,是用turtle画出函数图像
最佳答案
2023-12-30 21:23:09
  1. import turtle
  2. import math


  3. def plot_function(func_expr, screen_width=800, screen_height=800):
  4.     # 设置屏幕组态
  5.     graph = turtle.Screen()
  6.     graph.title(func_expr)
  7.     graph.setup(width=screen_width, height=screen_height)

  8.     # 创建一个函数图像的乌龟
  9.     plot_t = turtle.Turtle(visible=False)
  10.     plot_t.speed(0)
  11.     plot_t.penup()
  12.     plot_t.color("blue")

  13.     # 创建一个坐标轴的乌龟
  14.     axis_t = turtle.Turtle(visible=False)
  15.     axis_t.speed(0)
  16.     axis_t.color("black")

  17.     # 定义xy坐标画图范围
  18.     x = range(-int(screen_width / 2), int(screen_height / 2))
  19.     y = [eval(func_expr.replace('x', str(i / 100))) for i in x]

  20.     # 画x轴
  21.     axis_t.penup()
  22.     axis_t.goto(-screen_width / 2, 0)
  23.     axis_t.pendown()
  24.     axis_t.forward(screen_width)

  25.     # 画y轴
  26.     axis_t.penup()
  27.     axis_t.goto(0, -screen_height / 2)
  28.     axis_t.pendown()
  29.     axis_t.left(90)
  30.     axis_t.forward(screen_height)

  31.     # 画x轴刻度线
  32.     for i in range(-int(screen_width / 2), int(screen_width / 2), 100):
  33.         axis_t.penup()
  34.         axis_t.goto(i, -10)
  35.         axis_t.pendown()
  36.         axis_t.forward(0)
  37.         axis_t.backward(20)

  38.     # 画y轴刻度线
  39.     axis_t.right(90)
  40.     for i in range(-int(screen_height / 2), int(screen_height / 2), 100):
  41.         axis_t.penup()
  42.         axis_t.goto(-10, i)
  43.         axis_t.pendown()
  44.         axis_t.forward(20)
  45.         axis_t.backward(20)

  46.     # 将乌龟移动到第一个位置,开始绘图
  47.     plot_t.penup()
  48.     plot_t.goto(x[0], y[0] * 100)
  49.     plot_t.pendown()

  50.     # 遍历x轴的位置,绘制y轴上的点
  51.     for (i, j) in zip(x, y):
  52.         plot_t.goto(i, j * 100)

  53.     # 使得窗口等待被关闭
  54.     turtle.done()


  55. if __name__ == '__main__':
  56.     func_expr = input("请输入函数表达式(变量为x):")
  57.     plot_function(func_expr)
复制代码


使用方法:




屏幕截图 2023-12-30 212236.png

求最佳答案

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
python爱好者. + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-12-30 17:50:03 | 显示全部楼层
要使用turtle库画出函数图像,需要先将函数表达式转换为程序可以理解的形式,并确定绘图的范围。下面是一个简单的示例,展示如何画出y=x^2函数的图像:

  1. import turtle

  2. # 定义函数表达式
  3. def func(x):
  4.     return x**2

  5. # 设置绘图范围
  6. x_min = -10
  7. x_max = 10
  8. y_min = 0
  9. y_max = 100

  10. # 创建Turtle对象
  11. t = turtle.Turtle()

  12. # 设置绘图速度和颜色
  13. t.speed(0)
  14. t.color("blue")

  15. # 调整坐标系位置和方向
  16. t.penup()
  17. t.goto(x_min, func(x_min))
  18. t.pendown()

  19. # 绘制函数图像
  20. for x in range(x_min, x_max+1):
  21.     t.goto(x, func(x))

  22. # 完成绘图
  23. turtle.done()
复制代码


在这个例子中,我们通过定义一个`func(x)`函数来表示函数表达式。然后,我们通过循环来遍历给定的范围内的x值,利用`goto(x, func(x))`函数将画笔移动到相应的位置,并用`func(x)`计算对应的y值。最后,我们使用`turtle.done()`函数在绘图完成后保持窗口不关闭。

你可以尝试修改函数表达式、范围和绘图设置来画出其他函数的图像。希望对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-30 17:52:55 | 显示全部楼层
坐标轴也要,要有单位上度并标上数值

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
python爱好者. + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-30 17:53:11 | 显示全部楼层
stumblemodel 发表于 2023-12-30 17:52
坐标轴也要,要有单位上度并标上数值


当画函数图像时,可以添加坐标轴,并在坐标轴上标上刻度和数值。下面是一个示例代码,展示了如何使用turtle库在函数图像上添加坐标轴和数值:

  1. import turtle

  2. # 定义函数表达式
  3. def func(x):
  4.     return x**2

  5. # 设置绘图范围和坐标轴长度
  6. x_min = -10
  7. x_max = 10
  8. y_min = 0
  9. y_max = 100
  10. axis_length = 400

  11. # 创建Turtle对象
  12. t = turtle.Turtle()

  13. # 设置绘图速度和颜色
  14. t.speed(0)
  15. t.color("blue")

  16. # 绘制坐标轴
  17. t.penup()
  18. t.goto(x_min, 0)
  19. t.pendown()
  20. t.goto(x_max, 0)

  21. t.penup()
  22. t.goto(0, y_min)
  23. t.pendown()
  24. t.goto(0, y_max)

  25. # 绘制刻度和数值
  26. for i in range(x_min, x_max+1):
  27.     t.penup()
  28.     t.goto(i, -5)
  29.     t.pendown()
  30.     t.goto(i, 5)
  31.     t.write(str(i), align='center')

  32. for i in range(y_min, y_max+1, 10):
  33.     t.penup()
  34.     t.goto(-5, i)
  35.     t.pendown()
  36.     t.goto(5, i)
  37.     t.write(str(i), align='right')

  38. # 调整坐标系位置和方向
  39. t.penup()
  40. t.goto(x_min, func(x_min))
  41. t.pendown()

  42. # 绘制函数图像
  43. for x in range(x_min, x_max+1):
  44.     t.goto(x, func(x))

  45. # 完成绘图
  46. turtle.done()
复制代码


在这个例子中,我们首先使用`goto()`函数绘制了x轴和y轴,并使用`write()`函数标上了刻度和数值。注意,在设置坐标轴长度时,我们可以根据需要调整`axis_length`的值。然后,我们按照之前的方式绘制函数图像。希望这个示例能帮助你更好地理解如何在函数图像上添加坐标轴和数值!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-30 17:59:33 | 显示全部楼层
有点过于紧密,可以放大这个图像

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
python爱好者. + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-30 17:59:51 | 显示全部楼层
stumblemodel 发表于 2023-12-30 17:59
有点过于紧密,可以放大这个图像


当你希望放大函数图像时,可以通过调整坐标轴的范围和刻度间隔来实现。下面是相应的示例代码,展示了如何放大函数图像:import turtle# 定义函数表达式def func(x):    return x**2# 设置绘图范围和坐标轴长度x_min = -10x_max = 10y_min = 0y_max = 100axis_length = 400# 计算坐标轴的比例scale_x = axis_length / (x_max - x_min)scale_y = axis_length / (y_max - y_min)# 创建Turtle对象t = turtle.Turtle()# 设置绘图速度和颜色t.speed(0)t.color("blue")# 绘制坐标轴t.penup()t.goto(scale_x * x_min, 0)t.pendown()t.goto(scale_x * x_max, 0)t.penup()t.goto(0, scale_y * y_min)t.pendown()t.goto(0, scale_y * y_max)# 绘制刻度和数值for i in range(x_min, x_max+1):    t.penup()    t.goto(i*scale_x, -5)    t.pendown()    t.goto(i*scale_x, 5)    t.write(str(i), align='center')for i in range(y_min, y_max+1, 10):    t.penup()    t.goto(-5, i*scale_y)    t.pendown()    t.goto(5, i*scale_y)    t.write(str(i), align='right')# 调整坐标系位置和方向t.penup()t.goto(scale_x * x_min, scale_y * func(x_min))t.pendown()# 绘制函数图像for x in range(x_min, x_max+1):    t.goto(x*scale_x, scale_y*func(x))# 完成绘图turtle.done()在这个示例中,我们首先计算了坐标轴的比例,即根据坐标轴的长度和范围来计算每个刻度的像素数。然后,我们在绘制坐标轴、刻度和数值时,将相应的坐标乘以比例,以实现放大效果。在绘制函数图像时,同样需要将x和y坐标乘以比例。你可以根据需求调整绘图范围、坐标轴长度和刻度间隔来放大或缩小函数图像。希望这个示例对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-30 21:23:09 | 显示全部楼层    本楼为最佳答案   
  1. import turtle
  2. import math


  3. def plot_function(func_expr, screen_width=800, screen_height=800):
  4.     # 设置屏幕组态
  5.     graph = turtle.Screen()
  6.     graph.title(func_expr)
  7.     graph.setup(width=screen_width, height=screen_height)

  8.     # 创建一个函数图像的乌龟
  9.     plot_t = turtle.Turtle(visible=False)
  10.     plot_t.speed(0)
  11.     plot_t.penup()
  12.     plot_t.color("blue")

  13.     # 创建一个坐标轴的乌龟
  14.     axis_t = turtle.Turtle(visible=False)
  15.     axis_t.speed(0)
  16.     axis_t.color("black")

  17.     # 定义xy坐标画图范围
  18.     x = range(-int(screen_width / 2), int(screen_height / 2))
  19.     y = [eval(func_expr.replace('x', str(i / 100))) for i in x]

  20.     # 画x轴
  21.     axis_t.penup()
  22.     axis_t.goto(-screen_width / 2, 0)
  23.     axis_t.pendown()
  24.     axis_t.forward(screen_width)

  25.     # 画y轴
  26.     axis_t.penup()
  27.     axis_t.goto(0, -screen_height / 2)
  28.     axis_t.pendown()
  29.     axis_t.left(90)
  30.     axis_t.forward(screen_height)

  31.     # 画x轴刻度线
  32.     for i in range(-int(screen_width / 2), int(screen_width / 2), 100):
  33.         axis_t.penup()
  34.         axis_t.goto(i, -10)
  35.         axis_t.pendown()
  36.         axis_t.forward(0)
  37.         axis_t.backward(20)

  38.     # 画y轴刻度线
  39.     axis_t.right(90)
  40.     for i in range(-int(screen_height / 2), int(screen_height / 2), 100):
  41.         axis_t.penup()
  42.         axis_t.goto(-10, i)
  43.         axis_t.pendown()
  44.         axis_t.forward(20)
  45.         axis_t.backward(20)

  46.     # 将乌龟移动到第一个位置,开始绘图
  47.     plot_t.penup()
  48.     plot_t.goto(x[0], y[0] * 100)
  49.     plot_t.pendown()

  50.     # 遍历x轴的位置,绘制y轴上的点
  51.     for (i, j) in zip(x, y):
  52.         plot_t.goto(i, j * 100)

  53.     # 使得窗口等待被关闭
  54.     turtle.done()


  55. if __name__ == '__main__':
  56.     func_expr = input("请输入函数表达式(变量为x):")
  57.     plot_function(func_expr)
复制代码


使用方法:




屏幕截图 2023-12-30 212236.png

求最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-18 19:27:42 | 显示全部楼层

在画反比例函数时,x经过0时会报错
(小学生都知道除数不为零,所以,当函数为反比例函数时,应该跳过0这个数字)
所以怎么判断函数为反比例(即除数含有x)(根据除数的不同x可能还要取不同值才会使除数为0)
有时可能不止一个x的值会使分母为零,需要因式分解才能找全所有可能的值,但python显然不具备能够分解因式的代码(至少不是我的实力能达到的)
所以这个问题求帮忙

评分

参与人数 1贡献 +3 收起 理由
python爱好者. + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-19 18:33:20 | 显示全部楼层
stumblemodel 发表于 2024-1-18 19:27
在画反比例函数时,x经过0时会报错
(小学生都知道除数不为零,所以,当函数为反比例函数时,应该跳过0这个数 ...

@Fishc
编程实现(用python)
你能解决这个问题吗,对于一个关于x的代数式,有多少种x的值,可以使代数式的值为零,分别是什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-19 18:34:18 | 显示全部楼层
stumblemodel 发表于 2024-01-19 18:33
@Fishc
编程实现(用python)
你能解决这个问题吗,对 ...


当我们要寻找代数式中使其值为零的x的值时,可以使用方程求解的方法。假设我们的代数式为f(x),那么我们需要解决的方程就是f(x) = 0。

示例代码如下:

  1. from sympy import symbols, Eq, solve

  2. # 定义符号变量x
  3. x = symbols('x')

  4. # 定义代数式
  5. expression = x ** 2 - 4 * x + 4

  6. # 构建方程f(x) = 0
  7. equation = Eq(expression, 0)

  8. # 求解方程
  9. solutions = solve(equation, x)

  10. # 输出结果
  11. print("方程的解为:")
  12. for solution in solutions:
  13.     print(f"x = {solution}")
复制代码


以上代码中,我们使用了SymPy库来进行符号计算。首先,我们定义了一个符号变量x。然后,我们定义了代数式expression,并用这个表达式构建了方程equation。接下来,使用solve()函数来求解方程equation,得到所有满足方程的x的值。最后,我们将所有的解打印出来。

你可以根据你的具体代数式修改代码中的expression,运行程序即可得到所有使代数式的值为零的x的值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-23 20:45:13 | 显示全部楼层
FishC 发表于 2024-1-19 18:34
当我们要寻找代数式中使其值为零的x的值时,可以使用方程求解的方法。假设我们的代数式为f(x),那么我 ...

对于像x^2-5x+6这样的代数式,存在多个x的值使代数式的值为0,怎样求出所有的解,存入列表
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-23 20:45:51 | 显示全部楼层
stumblemodel 发表于 2024-01-23 20:45
对于像x^2-5x+6这样的代数式,存在多个x的值使代数式的 ...


要求解代数式x^2 - 5x + 6 = 0的所有解,并将它们存入一个列表中,可以使用同样的方法,只需要稍微修改一下代码即可。示例代码如下:from sympy import symbols, Eq, solve# 定义符号变量xx = symbols('x')# 定义代数式expression = x ** 2 - 5 * x + 6# 构建方程f(x) = 0equation = Eq(expression, 0)# 求解方程solutions = solve(equation, x)# 存储解的列表solution_list = []# 将解添加到列表中for solution in solutions:    solution_list.append(solution)# 输出结果print("方程的解为:", solution_list)在这个例子中,我们首先定义了符号变量x,并定义了代数式expression。然后,我们使用这个代数式构建了方程equation。接着,使用solve()函数求解方程,得到所有满足方程的x的值,并将其存入solutions列表中。最后,我们遍历solutions列表,将解依次添加到solution_list中。最终,我们打印出solution_list即可得到所有的解。你可以根据你的具体代数式修改代码中的expression,运行程序即可得到所有使代数式的值为零的x的值,并存入一个列表。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-23 20:46:49 | 显示全部楼层
FishC 发表于 2024-1-23 20:45
要求解代数式x^2 - 5x + 6 = 0的所有解,并将它们存入一个列表中,可以使用同样的方法,只需要稍微修改 ...

请把代码写成代码块
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-23 20:47:23 | 显示全部楼层
stumblemodel 发表于 2024-01-23 20:46
请把代码写成代码块

  1. from sympy import symbols, Eq, solve

  2. # 定义符号变量x
  3. x = symbols('x')

  4. # 定义代数式
  5. expression = x ** 2 - 5 * x + 6

  6. # 构建方程f(x) = 0
  7. equation = Eq(expression, 0)

  8. # 求解方程
  9. solutions = solve(equation, x)

  10. # 存储解的列表
  11. solution_list = []

  12. # 将解添加到列表中
  13. for solution in solutions:
  14.     solution_list.append(solution)

  15. # 输出结果
  16. print("方程的解为:", solution_list)
复制代码


将以上代码保存为一个.py文件,运行后即可得到所有的解。在输出结果中,方程的解将以列表的形式展示出来。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-27 20:20:08 | 显示全部楼层
stumblemodel 发表于 2024-1-18 19:27
在画反比例函数时,x经过0时会报错
(小学生都知道除数不为零,所以,当函数为反比例函数时,应该跳过0这个数 ...

举个例子?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-27 20:52:54 | 显示全部楼层

比如,y=2/x,在遍历x坐标时,当x=0,这个式子无意义,反映在代码上就是报错,如何就算出可以使分母为0的x的值,这样就可以跳过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-23 22:36:45 | 显示全部楼层
stumblemodel 发表于 2024-2-27 20:52
比如,y=2/x,在遍历x坐标时,当x=0,这个式子无意义,反映在代码上就是报错,如何就算出可以使分母为0的x ...


try;except试试?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 15:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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