使用Python,matplotlib绘制复杂曲线,并求其交点,y=-sin(x)-x-1并求解函数的值

50 篇文章 2 订阅
39 篇文章 5 订阅

写这篇博客源于博友的提问,将介绍如何使用Python,matplotlib绘制复杂曲线,并求其交点,y=-sin(x)-x-1并求解函数的值。
在这里插入图片描述

1. 效果图

y=sin(x)效果图如下:
在这里插入图片描述

y = -x - ln(x)效果图如下:
在这里插入图片描述

y=-sin(x)-x-1 & y=0 效果图如下:
求解:函数 sin(x)+x+1=0的值
可以理解为 求y=-sin(x)-x-1 与 y=0这俩条线的交点的值
求解值,可以先缩小俩条曲线x与y的范围,然后计算相邻点的值 < 某个值0.1等,则认为相交。

在这里插入图片描述

2. 源码

import numpy as np
from matplotlib import pyplot as plt

# 1. 绘制y=sin(x)
# 定义 x 变量的范围 (-15,15) 数量 100
x = np.linspace(-15, 15, 100)
y = np.sin(x)

# 开始绘图
# 绘制 y=-x-exp(x) 的图像,设置 color 为 red,线宽度是 1,线的样式是 --
plt.plot(x, y, color='red', linewidth=1.0, linestyle='--')
plt.title('y=sin(x)')
plt.show()

# 3. 绘制y = -x - ln(x),要求x范围[0,2]
# 定义 x 变量的范围 (0,2) 数量 500
x = np.linspace(0, 2, 500)
y = -x - np.exp(x)

# Figure 并指定大小
plt.figure(num=3, figsize=(8, 5))
# 绘制 y=-x-exp(x) 的图像,设置 color 为 red,线宽度是 1,线的样式是 --
plt.plot(x, y, color='red', linewidth=1.0, linestyle='--')
plt.title('y = -x - np.exp(x)')
plt.show()

# 2. y=1+x+sin(x) 其中x范围为[-Π/2,Π/2]
# 绘制y=-1-x-np.sin(x)  与另一条线y=0相交以查看是否有解
x1 = np.linspace(-np.pi / 2, np.pi / 2, 100)
y1 = -1 - x - np.sin(x)
plt.plot(x1, y1, color='red', linewidth=1.0, linestyle='dashdot')
x2 = x1
y2 = np.zeros(len(x2))
plt.plot(x2, y2, color='green', linewidth=1.0, linestyle='solid')
plt.title('y = -1-x-np.sin(x) & y=0')
plt.show()

# 从上图可以看到俩条线有交点,交点就是其解
# 下边用算法计算俩条线的交点值
x1 = x1.tolist()
x2 = x2.tolist()
y1 = y1.tolist()
y2 = y2.tolist()
x_begin = max(x1[0], x2[0])
x_end = min(x1[-1], x2[-1])

points1 = [t for t in zip(x1, y1) if x_begin <= t[0] <= x_end]
points2 = [t for t in zip(x2, y2) if x_begin <= t[0] <= x_end]

idx = 0
nrof_points = len(points1)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x1, y1, color='red', linewidth=1.0, linestyle='dashdot')
ax.plot(x2, y2, color='green', linewidth=1.0, linestyle='solid')
while idx < nrof_points - 1:
    # 迭代逼近俩条线的交点
    y_min = min(points1[idx][1], points1[idx + 1][1])
    y_max = max(points1[idx + 1][1], points2[idx + 1][1])

    x3 = np.linspace(points1[idx][0], points1[idx + 1][0], 1000)
    y1_new = np.linspace(points1[idx][1], points1[idx + 1][1], 1000)
    y2_new = np.linspace(points2[idx][1], points2[idx + 1][1], 1000)

    # 近似距离小于0.001认为相交
    tmp_idx = np.argwhere(np.isclose(y1_new, y2_new, atol=0.001)).reshape(-1)
    if len(tmp_idx) > 0:
        for i in tmp_idx:
            print("sin(x)+x+1=0 val: ", x3[i])
            ax.plot(x3[i], y2_new[i], 'ro')  # 绘制逼近求解值的点

    idx += 1

plt.title('y = -1-x-np.sin(x) & y=0')
plt.show()

参考

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛一枚~

您的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值