• 个人笔记--python用tanh画圆形,正方形,长方形(epsilon界面宽度)


    用tanh函数画图

    圆形

    在这里插入图片描述

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 创建一个二维网格
    xx = np.linspace(-1, 1, 1000)
    yy = np.linspace(-1, 1, 1000)
    x_i, y_i = np.meshgrid(xx, yy)
    
    # 圆的半径和中心
    r = 0.4
    center_x, center_y = 0, 0  # 假设圆心在(0, 0)
    
    # 计算每个网格点到圆心的距离
    distance = np.sqrt((x_i - center_x) ** 2 + (y_i - center_y) ** 2)
    
    # 使用tanh函数来近似表示半圆区域
    # 注意:tanh函数不能直接用于表示半圆,但我们可以通过设置阈值来近似表示
    epsilon = 0.01 # 控制tanh函数的“陡峭度”
    u0 = 0.5 * (1 + np.tanh((r - distance) / epsilon))
    u0[distance > r] = -1  # 强制圆外的值为-1
    
    # 绘制结果
    fig, ax = plt.subplots()
    p = ax.pcolormesh(x_i, y_i, u0, cmap='viridis', shading='auto')
    ax.set_aspect('equal', 'box')  # 保持x和y轴的比例相同
    fig.colorbar(p, ax=ax, label='u0 Value')
    
    # 设置标题和坐标轴标签
    plt.title('Approximate Half Circle using tanh')
    plt.xlabel('X')
    plt.ylabel('Y')
    
    # 显示图形
    plt.show()
    

    半圆

    在这里插入图片描述

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 创建一个二维网格
    xx = np.linspace(-1, 1, 1000)
    yy = np.linspace(-1, 1, 1000)
    x_i, y_i = np.meshgrid(xx, yy)
    
    # 圆的半径和中心
    r = 0.4
    center_x, center_y = 0, -1  # 假设圆心在(0, -1)
    
    # 计算每个网格点到圆心的距离
    distance = np.sqrt((x_i - center_x) ** 2 + (y_i - center_y) ** 2)
    
    # 使用tanh函数来近似表示半圆区域
    # 注意:tanh函数不能直接用于表示半圆,但我们可以通过设置阈值来近似表示
    epsilon = 0.01 # 控制tanh函数的“陡峭度”
    u0 = 0.5 * (1 + np.tanh((r - distance) / epsilon))
    u0[distance > r] = -1  # 强制圆外的值为-1
    
    # 绘制结果
    fig, ax = plt.subplots()
    p = ax.pcolormesh(x_i, y_i, u0, cmap='viridis', shading='auto')
    ax.set_aspect('equal', 'box')  # 保持x和y轴的比例相同
    fig.colorbar(p, ax=ax, label='u0 Value')
    
    # 设置标题和坐标轴标签
    plt.title('Approximate Half Circle using tanh')
    plt.xlabel('X')
    plt.ylabel('Y')
    
    # 显示图形
    plt.show()
    

    两个圆形

    在这里插入图片描述
    在这里插入图片描述

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 创建一个二维网格
    xx = np.linspace(0, 1, 1000)
    yy = np.linspace(0, 1, 1000)
    x_i, y_i = np.meshgrid(xx, yy)
    
    # 圆的半径和中心
    r1 = 0.15  # 如果要分开点,就设为0.14
    r2 = 0.15  # 如果要分开点,就设为0.14
    center_x1, center_y1 = 0.35, 0.5  # 圆心1
    center_x2, center_y2 = 0.65, 0.5  # 圆心2
    
    # 计算每个网格点到圆心的距离
    distance1 = np.sqrt((x_i - center_x1) ** 2 + (y_i - center_y1) ** 2)
    distance2 = np.sqrt((x_i - center_x2) ** 2 + (y_i - center_y2) ** 2)
    
    # 使用tanh函数来近似表示半圆区域
    # 注意:tanh函数不能直接用于表示半圆,但我们可以通设置阈值来近似表示
    epsilon = 0.01 # 控制tanh函数的“陡峭度”
    phi1 = np.tanh((r1 - distance1) / (2 * epsilon))
    phi2 = np.tanh((r2 - distance2) / (2 * epsilon))
    
    u0 = np.maximum(phi1, phi2)
    # u0 = 1 * (1 + phi1 + phi2)  # 两种都可以生成两个圆
    
    # 分别找出距离两个圆心都大于半径的点的索引
    outside_circle1 = distance1 > r1
    outside_circle2 = distance2 > r2
    
    # 使用逻辑与来找出两个条件都满足的点
    outside_both_circles = np.logical_and(outside_circle1, outside_circle2)
    
    # 将这些点对应的u0值设置为-1
    u0[outside_both_circles] = -1
    
    # 绘制结果
    fig, ax = plt.subplots()
    p = ax.pcolormesh(x_i, y_i, u0, cmap='viridis', shading='auto')
    ax.set_aspect('equal', 'box')  # 保持x和y轴的比例相同
    fig.colorbar(p, ax=ax, label='u0 Value')
    
    # 设置标题和坐标轴标签
    plt.title('Approximate Half Circle using tanh')
    plt.xlabel('X')
    plt.ylabel('Y')
    
    # 显示图形
    plt.show()
    

    正方形(不带界面过渡)

    在这里插入图片描述

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 创建一个二维网格
    xx = np.linspace(-1, 1, 1000)
    yy = np.linspace(-1, 1, 1000)
    x_i, y_i = np.meshgrid(xx, yy)
    
    # 正方形的中心和边长
    center_x, center_y = 0, 0  # 假设正方形中心在(0, 0),为了简化计算
    side_length = 0.5  # 正方形边长的一半
    
    # 使用tanh函数来近似正方形的四个边界
    # 注意:这不是一个完美的正方形,只是一个近似
    epsilon = 0.01  # 控制tanh函数的“陡峭度”
    
    # 近似上边界
    u_top = 0.5 * (1 + np.tanh((side_length - np.abs(y_i - center_y)) / epsilon))
    # 近似下边界
    u_bottom = 0.5 * (1 + np.tanh((side_length - np.abs(y_i + center_y)) / epsilon))
    # 近似左边界
    u_left = 0.5 * (1 + np.tanh((side_length - np.abs(x_i - center_x)) / epsilon))
    # 近似右边界
    u_right = 0.5 * (1 + np.tanh((side_length - np.abs(x_i + center_x)) / epsilon))
    
    # 四个边界的交集(即正方形内部)应取得高值
    u0 = np.minimum(np.minimum(u_top, u_bottom), np.minimum(u_left, u_right))
    u0[u0 < 0.99] = -1  # 强制非正方形内部的值为-1(可调整阈值)
    u0[u0 >= 0.99] = 1  # 强制正方形内部的值为1(可调整阈值)
    
    # 绘制结果
    fig, ax = plt.subplots()
    p = ax.pcolormesh(x_i, y_i, u0, cmap='viridis', shading='auto')
    ax.set_aspect('equal', 'box')  # 保持x和y轴的比例相同
    fig.colorbar(p, ax=ax, label='u0 Value')
    
    # 设置标题和坐标轴标签
    plt.title('Approximate Square using tanh')
    plt.xlabel('X')
    plt.ylabel('Y')
    
    # 显示图形
    plt.show()
    

    长方形(不带界面过渡)

    在这里插入图片描述

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 创建一个二维网格
    xx = np.linspace(-1, 1, 1000)
    yy = np.linspace(-1, 1, 1000)
    x_i, y_i = np.meshgrid(xx, yy)
    
    # 长方形的中心和尺寸
    center_x, center_y = 0, 0  # 假设长方形中心在(0, 0)
    width = 0.6  # 长方形的宽度
    height = 0.4  # 长方形的高度
    half_width = width / 2
    half_height = height / 2
    
    # 使用tanh函数来近似长方形的四个边界
    epsilon = 0.01  # 控制tanh函数的“陡峭度”
    
    # 近似上边界
    u_top = 0.5 * (1 + np.tanh((half_height - (y_i - center_y)) / epsilon))
    # 近似下边界
    u_bottom = 0.5 * (1 + np.tanh((half_height - (center_y - y_i)) / epsilon))
    # 近似左边界
    u_left = 0.5 * (1 + np.tanh((half_width - (x_i - center_x)) / epsilon))
    # 近似右边界
    u_right = 0.5 * (1 + np.tanh((half_width - (center_x - x_i)) / epsilon))
    
    # 长方形的内部是四个边界的交集,取四个边界中的最小值
    u0 = np.minimum.reduce([u_top, u_bottom, u_left, u_right])
    u0[u0 < 0.99] = -1  # 强制非长方形内部的值为-1(可调整阈值)
    u0[u0 >= 0.99] = 1  # 强制长方形内部的值为1(可调整阈值)
    
    # 绘制结果
    fig, ax = plt.subplots()
    p = ax.pcolormesh(x_i, y_i, u0, cmap='viridis', shading='auto')
    ax.set_aspect('equal', 'box')  # 保持x和y轴的比例相同
    fig.colorbar(p, ax=ax, label='u0 Value')
    
    # 设置标题和坐标轴标签
    plt.title('Approximate Rectangle using tanh')
    plt.xlabel('X')
    plt.ylabel('Y')
    
    # 显示图形
    plt.show()
    

    边界上的长方形(不带界面过渡)

    在这里插入图片描述

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 创建一个二维网格
    xx = np.linspace(-0.5, 0.5, 1000)
    yy = np.linspace(0, 0.5, 1000)
    x_i, y_i = np.meshgrid(xx, yy)
    
    # 长方形的中心和尺寸
    center_x, center_y = 0, 0.0625  # 假设长方形中心在(0, 0)
    width = 0.5  # 长方形的宽度(长)
    height = 0.125  # 长方形的高度
    half_width = width / 2
    half_height = height / 2
    
    # 使用tanh函数来近似长方形的四个边界
    epsilon = 0.01  # 控制tanh函数的“陡峭度”
    
    # 近似上边界
    u_top = 1 * (1 + np.tanh((half_height - (y_i - center_y)) / epsilon))
    # 近似下边界
    u_bottom = 1 * (1 + np.tanh((half_height - (center_y - y_i)) / epsilon))
    # 近似左边界
    u_left = 1 * (1 + np.tanh((half_width - (x_i - center_x)) / epsilon))
    # 近似右边界
    u_right = 1 * (1 + np.tanh((half_width - (center_x - x_i)) / epsilon))
    
    # 长方形的内部是四个边界的交集,取四个边界中的最小值
    u0 = np.minimum.reduce([u_top, u_bottom, u_left, u_right])
    u0[u0 < 0.99] = -1  # 强制非长方形内部的值为-1(可调整阈值)
    u0[u0 >= 0.99] = 1  # 强制长方形内部的值为1(可调整阈值)
    
    # # 绘制结果
    # fig, ax = plt.subplots()
    # p = ax.pcolormesh(x_i, y_i, u0, cmap='viridis', shading='auto')
    # ax.set_aspect('equal', 'box')  # 保持x和y轴的比例相同
    # fig.colorbar(p, ax=ax, label='u0 Value')
    #
    # # 设置标题和坐标轴标签
    # plt.title('Approximate Rectangle using tanh')
    # plt.xlabel('X')
    # plt.ylabel('Y')
    #
    # # 显示图形
    # plt.grid()
    # plt.show()
    
    # 估算角点位置(这里只是估算,不是精确值)
    # 左上角
    x_left_top, y_left_top = center_x - half_width, center_y + half_height
    # 右上角
    x_right_top, y_right_top = center_x + half_width, center_y + half_height
    # 左下角
    x_left_bottom, y_left_bottom = center_x - half_width, center_y - half_height
    # 右下角
    x_right_bottom, y_right_bottom = center_x + half_width, center_y - half_height
    
    # 绘制结果
    fig, ax = plt.subplots()
    p = ax.pcolormesh(x_i, y_i, u0, cmap='viridis', shading='auto')
    ax.set_aspect('equal', 'box')  # 保持x和y轴的比例相同
    fig.colorbar(p, ax=ax, label='u0 Value')
    
    # 设置标题和坐标轴标签
    plt.title('Approximate Rectangle using tanh')
    plt.xlabel('X')
    plt.ylabel('Y')
    
    # 显示长方形四个角的坐标数字
    plt.text(x_left_top, y_left_top, f'({x_left_top:.2f}, {y_left_top:.2f})', va='top', ha='right', color='red')
    plt.text(x_right_top, y_right_top, f'({x_right_top:.2f}, {y_right_top:.2f})', va='top', ha='left', color='red')
    plt.text(x_left_bottom, y_left_bottom, f'({x_left_bottom:.2f}, {y_left_bottom:.2f})', va='bottom', ha='right', color='red')
    plt.text(x_right_bottom, y_right_bottom, f'({x_right_bottom:.2f}, {y_right_bottom:.2f})', va='bottom', ha='left', color='red')
    
    # 显示网格和图形
    plt.grid()
    plt.show()
    

    边界上的长方形(带界面宽度)

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 创建一个二维网格
    xx = np.linspace(-0.5, 0.5, 1000)
    yy = np.linspace(0, 0.5, 1000)
    x_i, y_i = np.meshgrid(xx, yy)
    
    # 长方形的中心和尺寸
    center_x, center_y = 0, 0.0625  # 长方形中心
    width = 0.5  # 长方形的宽度(长)
    height = 0.125  # 长方形的高度
    half_width = width / 2
    half_height = height / 2
    
    # 使用tanh函数来近似长方形的四个边界
    epsilon = 0.01  # 控制tanh函数的“陡峭度”
    
    # 近似上边界
    u_top = np.tanh((half_height - (y_i - center_y)) / (2 * epsilon))
    # # 近似下边界
    # u_bottom = np.tanh((half_height - (center_y - y_i)) / (2 * epsilon))
    u_bottom = np.ones((1000, 1000))
    # 近似左边界
    u_left = np.tanh((half_width - (x_i - center_x)) / (2 * epsilon))
    # 近似右边界
    u_right = np.tanh((half_width - (center_x - x_i)) / (2 * epsilon))
    
    # 长方形的内部是四个边界的交集,取四个边界中的最小值
    u0 = np.minimum.reduce([u_top, u_bottom, u_left, u_right])
    
    # # 绘制结果
    fig, ax = plt.subplots()
    p = ax.pcolormesh(x_i, y_i, u0, cmap='viridis', shading='auto')
    ax.set_aspect('equal', 'box')  # 保持x和y轴的比例相同
    fig.colorbar(p, ax=ax, label='u0 Value')
    
    # 设置标题和坐标轴标签
    plt.title('Approximate Rectangle using tanh')
    plt.xlabel('X')
    plt.ylabel('Y')
    
    # 显示图形
    plt.grid()
    plt.show()
    
    
    
  • 相关阅读:
    【vscode】 unable to connect to github.com
    《爱在 ZStack Cube 超融合》三部曲
    汇编语言程序设计·RB(AT&T汇编)_笔记_第6章:控制执行流程
    Java线程状态转换
    【视频】k8s套娃开发调试dapr应用 - 在6月11日【开源云原生开发者日】上的演示
    SDN实战团技术分享(三十八):DPDK助力NFV与云计算
    Chrome的使用技巧
    李沐机器学习环境配置相关
    无人机飞控系统硬件设计
    【数据结构基础_字符串】Leetcode 409.最长回文串
  • 原文地址:https://blog.csdn.net/pdc31czy/article/details/139419898