用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统

心理学家 Kernberg 提出:我们心里最基本的关系单元,是"我对自己的感觉 + 我对对方的感觉 + 两人之间的情感氛围"这三样绑在一起。

用两个变量来简化:

  • x = 你心里"我"的感觉(正值=觉得自己还行/可爱;负值=觉得自己糟/没价值)
  • y = 你心里"对方"的感觉(正值=觉得对方好/安全;负值=觉得对方坏/危险)

一段关系能不能稳,就看 x 和 y 怎么互相影响、往哪个方向漂。

人分四种"劲头"

文章把每个人按两种劲头分类:

第一种劲头(a):你对自己,是天然往"好"里漂,还是往"糟"里漂?

  • a > 0:自带正能量,自己就能把自己稳住
  • a < 0:自带负能量,自己就容易往下滑

第二种劲头(b):你和别人互动时,是互相成就,还是互相消耗?

  • b > 0:跟人打交道让你"充电"
  • b < 0:跟人打交道让你"放电"

两种劲头一组合,人就分成四种:

类型 特点 生活里的样子
分享者 a>0, b>0 自己状态好,也乐意成就别人
掠食者 a>0, b<0 自己状态好,但靠"吃"别人来维持
奉献者 a<0, b>0 自己状态一般,但乐于付出
寄生者 a<0, b<0 自己状态差,也消耗别人

关系稳不稳,关键看"互补"还是"相似"

最反直觉的结论:

💡 两个人太像,关系反而处不好;一正一反"互补",关系才稳。

如:"一山不容二虎,红花还需绿叶配"。

为啥?用方程推出来的------

两个分享者在一起(R11) :一开始双赢,互相促进,看着美滋滋。但问题在于:两人都往"好"里漂,越漂越远,最后两个人变得越来越像,融成一个人------关系没了,变成"自恋共同体"。

两个奉献者在一起(R33) :俩人都付出、都不为自己,结果是双双耗尽归零 。文章举的例子很扎心:"贫贱夫妻百事哀",说的就是这种情况。

两个寄生者在一起(R44):一起烂下去,直到关系解体。

啥样才稳? 一个"对自己感觉好"、一个"对自己感觉差";或者一个"付出型"、一个"索取型"。比如:

  • 分享者 + 奉献者:一个自带光芒愿意给,一个甘于付出,形成稳定的互补循环
  • 掠食者 + 奉献者 :一个索取,一个愿意给,这种"一进一出"的拉扯反而能让关系长期维持动态平衡

打个比方:这就像生态学里的"捕食者---猎物模型",狼和羊数量此消彼长,反而能形成一个稳定的循环,谁也不会立刻消失。

关系最终的三种命运

不管哪种组合,长期来看关系只有三种走向:

  1. 稳定循环:两人此消彼长、有远近冷暖的波动,但始终维系着关系(健康关系)
  2. 融合 :两人越来越像,最后"我中有你、你中有我",关系还在,但变成了自恋的延伸(比如那种"夫妻相"到失去自我的状态)
  3. 湮灭:其中一方归零,关系断裂(分手、绝交、情感死亡)

好的关系不是找"和自己一样好的人",而是找一个能和你形成"互补张力"的人------你进我退、你冷我暖,两个独立的部分靠差异咬合在一起,关系才能转得动。

如果两个人都想当"红花",这关系转不动;必须一个红花、一个绿叶,或者一个狼、一个羊,这关系才有生命力。

这篇文章尝试用**动力学系统(微分方程)**为 Kernberg 的客体关系单元提供数学化的操作定义,把"自体---客体"这对心理结构建模成一个二维耦合系统:

x˙=a1x+b1xy,y˙=a2y+b2xy\dot{x}=a_1 x+b_1 x y,\quad \dot{y}=a_2 y+b_2 x yx˙=a1x+b1xy,y˙=a2y+b2xy

  • x = 自体表象的情感效价,y = 客体表象的情感效价
  • a₁, a₂ = 自体/客体的内禀情感基调(自发漂移方向)
  • b₁, b₂ = 自体---客体相互作用的调节强度

推导

1. 平衡点

  • 平凡平衡点 E₀ = (0,0),对应情感中立、关系未激活
  • 非平凡平衡点 E₁ = (−a₂/b₂, −a₁/b₁),对应激活的客体关系单元

2. 稳定性分类

  • 当 a₁a₂ > 0 时,E₁ 是鞍点(不稳定)
  • 当 a₁a₂ < 0 时,E₁ 是中心,线性中性稳定,非线性系统可能出现极限环

3. 四种主体原型(按 a、b 符号组合)

a 符号 b 符号 主体类型
a>0 b>0 分享者
a>0 b<0 掠食者
a<0 b>0 奉献者
a<0 b<0 寄生者

自体与客体各取四种之一,组合出 16 种客体关系单元(R₁₁--R₄₄)

三类关系动态

文章最终把16种单元归纳为三种命运:

  • 稳定:闭合环绕运动 → 周期轨道(自体和客体在远近波动中维持关系)
  • 融合:自体和客体趋于同步 → 坍缩为自体---自体客体关系(客体关系空间降维为自体空间)
  • 湮灭 :自体或客体维度趋向 0 → 关系单元断裂
    核心命题:只有自体与客体"互补"(对自己态度不同),才能构成稳定的客体关系;相似则无法稳定下来------所谓"一山不容二虎,红花还需绿叶配"。

能够形成稳定客体关系的单元是:分享-奉献(R₁₃, R₃₁)、分享-寄生(R₁₄, R₄₁)、掠食-奉献(R₂₃, R₃₂)、掠食-寄生(R₂₄, R₄₂)

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import FancyBboxPatch
from scipy.integrate import odeint

# 设置中文字体(若没有 SimHei,可改为 'Microsoft YaHei' 或 'KaiTi')
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

def phase_portrait(ax, a1, b1, a2, b2, title, subtitle, title_color):
    """
    画一个 R 单元的相图
    """
    # ---------- 向量场 ----------
    x = np.linspace(-3, 3, 28)
    y = np.linspace(-3, 3, 28)
    X, Y = np.meshgrid(x, y)
    U = a1 * X + b1 * X * Y
    V = a2 * Y + b2 * X * Y

    # 流线
    ax.streamplot(X, Y, U, V,
                  start_points=np.random.uniform(-2.5, 2.5, (60, 2)),
                  linewidth=0.8, arrowsize=0.8, density=1.0,
                  color='#90A4AE', arrowstyle='->')

    # ---------- 平衡点 ----------
    # 非零平衡点
    if abs(b2) > 1e-9 and abs(b1) > 1e-9:
        x0, y0 = -a2 / b2, -a1 / b1
        if -3.5 < x0 < 3.5 and -3.5 < y0 < 3.5:
            ax.plot(x0, y0, 'o', color=title_color, markersize=10, zorder=5)
            ax.plot(x0, y0, 'o', color='white', markersize=6, zorder=6)
    # 原点(用方块标记)
    ax.plot(0, 0, 's', color='#333', markersize=7, zorder=5)

    # ---------- 数值积分几条轨迹 ----------
    def f(z, t):
        x, y = z
        return [a1 * x + b1 * x * y, a2 * y + b2 * x * y]

    # ---- ★★★ 关键修复:动态积分时长 ★★★ ----
    # R11 (1,1,1,1) 和 R44 (-1,-1,-1,-1) 存在有限时间奇点,轨迹在 t≈0.4~1.0 时爆炸
    # 因此积分到 0.8 秒即可展示趋势,又不会触发数值警告
    if (a1 > 0 and a2 > 0) or (a1 < 0 and a2 < 0):
        T = 0.8          # 发散型,只积 0.8 秒
        n_points = 150
    else:
        T = 8.0          # 稳定型(极限环或焦点),积 8 秒充分展示
        n_points = 400

    ts = np.linspace(0, T, n_points)

    # 初始点集合
    init_points = [(-2, -2), (-2, 2), (2, -2), (2, 2),
                   (0.5, 0.5), (-0.5, -0.5)]
    for init in init_points:
        # ★★★ 增加 mxstep=5000,防止步数超限 ★★★
        sol = odeint(f, init, ts, mxstep=5000)
        xs, ys = sol[:, 0], sol[:, 1]
        # 只绘制边界内的部分(边界设为 ±5)
        mask = (np.abs(xs) < 5) & (np.abs(ys) < 5)
        ax.plot(xs[mask], ys[mask], '-', color=title_color,
                lw=2.2, alpha=0.75, zorder=4)

    # ---------- 画布装饰 ----------
    ax.set_xlim(-3, 3)
    ax.set_ylim(-3, 3)
    ax.axhline(0, color='#ccc', lw=0.5)
    ax.axvline(0, color='#ccc', lw=0.5)
    ax.set_xlabel('x  (自体表象)', fontsize=10)
    ax.set_ylabel('y  (客体表象)', fontsize=10)
    ax.set_title(title, fontsize=13, fontweight='bold', color=title_color, pad=8)
    ax.text(0.02, 0.02, subtitle, transform=ax.transAxes,
            fontsize=9, color='#555', va='bottom')


# ---------- 四种典型单元参数 ----------
cases = [
    # (a1, b1, a2, b2, 标题, 副标题, 颜色)
    (1, 1, 1, 1,    'R11  分享·分享',  '融合 → (+∞,+∞)', '#E8553D'),
    (1, 1, -1, 1,   'R13  分享·奉献',  '稳定周期轨道',   '#2E7D32'),
    (1, -1, -1, 1,  'R23  掠食·奉献',  '稳定母婴关系',   '#7E57C2'),
    (-1, -1, -1, -1, 'R44  寄生·寄生',  '共同毁灭',       '#37474F'),
]

# ---------- 绘制并保存 ----------
fig, axes = plt.subplots(2, 2, figsize=(14, 12), facecolor='white')
fig.suptitle('客体关系单元  相空间轨迹示例', fontsize=18, fontweight='bold', y=0.98)

for ax, case in zip(axes.flat, cases):
    phase_portrait(ax, *case)

plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.savefig('or_phase_portraits.png', dpi=160, bbox_inches='tight', facecolor='white')
print('done')
python 复制代码
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.patches import FancyBboxPatch, FancyArrowPatch
import numpy as np

# ========== 使用 Windows 常见中文字体 ==========
plt.rcParams['font.family'] = 'SimHei'   # 若还报错可改为 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False

fig = plt.figure(figsize=(28, 36), facecolor='#FAFAF8')
fig.subplots_adjust(hspace=0.4, wspace=0.3, top=0.96, bottom=0.02, left=0.04, right=0.96)

# ========== 颜色系统 ==========
C_AXIS_X = '#E8553D'   # 自体 红橙
C_AXIS_Y = '#2E86AB'   # 客体 蓝
C_SHARE  = '#4CAF50'   # 分享者 绿
C_PRED   = '#FF7043'   # 掠食者 橙
C_DEVO   = '#7E57C2'   # 奉献者 紫
C_PARA   = '#78909C'   # 寄生者 灰蓝
C_STABLE = '#2E7D32'   # 稳定 深绿
C_FUSE   = '#C62828'   # 融合 深红
C_ANNI   = '#37474F'   # 湮灭 深灰
C_BG     = '#FAFAF8'
C_TEXT   = '#212121'
C_SUB    = '#5D4037'

def draw_rounded_box(ax, x, y, w, h, text, facecolor, edgecolor='#333', fontsize=10,
                     fontweight='normal', text_color='white', lw=1.5, alpha=0.92, zorder=3):
    box = FancyBboxPatch((x, y), w, h, boxstyle="round,pad=0.15",
                         facecolor=facecolor, edgecolor=edgecolor, lw=lw, alpha=alpha, zorder=zorder)
    ax.add_patch(box)
    ax.text(x + w/2, y + h/2, text, ha='center', va='center',
            fontsize=fontsize, fontweight=fontweight, color=text_color, zorder=zorder+1)

def arrow(ax, x1, y1, x2, y2, color='#555', lw=2, style='->', zorder=2):
    ax.annotate('', xy=(x2, y2), xytext=(x1, y1),
                arrowprops=dict(arrowstyle=style, color=color, lw=lw), zorder=zorder)

# =====================================================
# 大标题
# =====================================================
fig.text(0.5, 0.985, '客体关系单元动力学模型 · 结构总图',
         ha='center', va='top', fontsize=26, fontweight='bold', color=C_TEXT)
fig.text(0.5, 0.972, 'Kernberg 客体关系单元  ×  动力学系统建模    |    作者:王其峰 / PsyPad',
         ha='center', va='top', fontsize=11, color=C_SUB)

# =====================================================
# 板块 1:核心方程
# =====================================================
ax1 = fig.add_axes([0.06, 0.905, 0.88, 0.06])
ax1.set_xlim(0, 10); ax1.set_ylim(0, 1.2)
ax1.axis('off')
draw_rounded_box(ax1, 0.2, 0.15, 4.3, 0.9,
    r'$\dot{x} = a_1 x + b_1 x y$' '\n' r'$\dot{y} = a_2 y + b_2 x y$',
    facecolor='#FFF8E1', edgecolor='#F9A825', fontsize=14, fontweight='bold', text_color='#E65100', lw=2)
ax1.text(5.0, 0.6, 'x = 自体表象  ·  y = 客体表象  ·  a = 内禀情感基调  ·  b = 互动调节强度',
         fontsize=12, va='center', color=C_TEXT)
arrow(ax1, 4.7, 0.6, 4.55, 0.6, color='#F9A825', lw=2)

# =====================================================
# 板块 2:参数语义与四种人格原型(上下两行)
# =====================================================
ax2 = fig.add_axes([0.06, 0.815, 0.88, 0.085])
ax2.set_xlim(0, 10); ax2.set_ylim(0, 1.4)
ax2.axis('off')

# a 参数
draw_rounded_box(ax2, 0.1, 0.85, 4.6, 0.45,
    'a 参数(内禀情感基调)\n'
    'a > 0  →  自发正向漂移(自恋维持)      a < 0  →  自发负向衰减(自我攻击)',
    facecolor='#FFF3E0', edgecolor='#E65100', fontsize=10, text_color='#BF360C', lw=1.5)

# b 参数
draw_rounded_box(ax2, 5.2, 0.85, 4.6, 0.45,
    'b 参数(互动调节强度)\n'
    'b > 0  →  相互促进(对外合作)          b < 0  →  相互消耗(对外攻击)',
    facecolor='#E3F2FD', edgecolor='#1565C0', fontsize=10, text_color='#0D47A1', lw=1.5)

# 四种原型
proto_data = [
    ('分享者\n(a>0, b>0)', C_SHARE),
    ('掠食者\n(a>0, b<0)', C_PRED),
    ('奉献者\n(a<0, b>0)', C_DEVO),
    ('寄生者\n(a<0, b<0)', C_PARA),
]
for i, (label, col) in enumerate(proto_data):
    cx = 0.6 + i * 2.35
    draw_rounded_box(ax2, cx, 0.05, 2.0, 0.7, label,
                     facecolor=col, edgecolor='#333', fontsize=11, fontweight='bold',
                     text_color='white', lw=1.5)
    if i < 3:
        arrow(ax2, cx + 2.0, 0.4, cx + 2.3, 0.4, color='#999', lw=1.5)

# =====================================================
# 板块 3:16 种组合矩阵(核心大图)
# =====================================================
ax3 = fig.add_axes([0.04, 0.42, 0.92, 0.38])
ax3.set_xlim(0, 10); ax3.set_ylim(0, 6.2)
ax3.axis('off')

# 标题
ax3.text(5.0, 6.0, '16 种客体关系单元  R_xy  矩阵', ha='center', va='center',
         fontsize=16, fontweight='bold', color=C_TEXT)

# 矩阵布局:所有下标改为普通数字
cells = [
    ('分享者 x1\n($\\dot{x}=x+xy$)', C_SHARE, [
        ('R11', '分享·分享', C_SHARE, '融合→+∞', C_FUSE),
        ('R12', '分享·掠食', C_PRED, '客体掠食自体', C_ANNI),
        ('R13', '分享·奉献', C_DEVO, '★ 稳定周期', C_STABLE),
        ('R14', '分享·寄生', C_PARA, '★ 稳定寄生', C_STABLE),
    ]),
    ('掠食者 x2\n($\\dot{x}=x-xy$)', C_PRED, [
        ('R21', '掠食·分享', C_SHARE, '自体掠食客体', C_ANNI),
        ('R22', '掠食·掠食', C_PRED, '相互毁灭融合', C_FUSE),
        ('R23', '掠食·奉献', C_DEVO, '★ 稳定母婴', C_STABLE),
        ('R24', '掠食·寄生', C_PARA, '★ 捕食竞争', C_STABLE),
    ]),
    ('奉献者 x3\n($\\dot{x}=-x+xy$)', C_DEVO, [
        ('R31', '奉献·分享', C_SHARE, '★ 稳定双赢', C_STABLE),
        ('R32', '奉献·掠食', C_PRED, '★ 稳定客体', C_STABLE),
        ('R33', '奉献·奉献', C_DEVO, '双双耗尽归零', C_ANNI),
        ('R34', '奉献·寄生', C_PARA, '融合吞噬', C_FUSE),
    ]),
    ('寄生者 x4\n($\\dot{x}=-x-xy$)', C_PARA, [
        ('R41', '寄生·分享', C_SHARE, '★ 双输周期', C_STABLE),
        ('R42', '寄生·掠食', C_PRED, '★ 寄生稳定', C_STABLE),
        ('R43', '寄生·奉献', C_DEVO, '双双归零', C_ANNI),
        ('R44', '寄生·寄生', C_PARA, '共同毁灭', C_FUSE),
    ]),
]

start_x = 1.8
start_y = 5.4
cell_w = 1.85
cell_h = 1.05
gap = 0.12

# 列标题:改为 y1, y2, y3, y4
for j, col_label in enumerate(['分享者 y1', '掠食者 y2', '奉献者 y3', '寄生者 y4']):
    cx = start_x + j * (cell_w + gap) + cell_w / 2
    ax3.text(cx, start_y + 0.25, col_label, ha='center', va='center',
             fontsize=11, fontweight='bold', color=C_AXIS_Y)

# 行
for i, (row_label, row_color, row_cells) in enumerate(cells):
    ry = start_y - i * (cell_h + gap)
    # 行标签
    draw_rounded_box(ax3, 0.0, ry - 0.1, 1.6, cell_h + 0.15,
                     row_label, facecolor=row_color, edgecolor='#555',
                     fontsize=9, fontweight='bold', text_color='white', lw=1.2, alpha=0.85)
    # 单元格
    for j, (rid, rlabel, base_col, result, result_col) in enumerate(row_cells):
        cx = start_x + j * (cell_w + gap)
        box = FancyBboxPatch((cx, ry - 0.1), cell_w, cell_h + 0.15,
                             boxstyle="round,pad=0.08",
                             facecolor=base_col, edgecolor='#888',
                             lw=1.0, alpha=0.28, zorder=3)
        ax3.add_patch(box)
        ax3.text(cx + cell_w/2, ry + cell_h - 0.15, rid,
                 ha='center', va='center', fontsize=10, fontweight='bold', color=base_col, zorder=4)
        ax3.text(cx + cell_w/2, ry + cell_h/2 - 0.1, rlabel,
                 ha='center', va='center', fontsize=9, color='#333', zorder=4)
        ax3.text(cx + cell_w/2, ry + 0.15, result,
                 ha='center', va='center', fontsize=8, fontweight='bold',
                 color=result_col, zorder=4)

# 图例
legend_y = 0.35
ax3.text(0.2, legend_y, '图例:', fontsize=10, fontweight='bold', color=C_TEXT)
for k, (txt, col) in enumerate([
    ('★ 稳定周期', C_STABLE), ('融合/镜映', C_FUSE), ('湮灭/归零', C_ANNI)
]):
    ax3.text(1.2 + k * 2.5, legend_y, txt, fontsize=10, fontweight='bold', color=col)

# =====================================================
# 板块 4:三种关系命运(用文字替代特殊符号)
# =====================================================
ax4 = fig.add_axes([0.06, 0.28, 0.88, 0.125])
ax4.set_xlim(0, 10); ax4.set_ylim(0, 1.6)
ax4.axis('off')

ax4.text(5.0, 1.45, '关系三种命运(吸引子)', ha='center', fontsize=14, fontweight='bold', color=C_TEXT)

fates = [
    ('[循环] 稳定循环', '闭合环绕运动\n自体客体远近波动\n关系长期维系',
     C_STABLE, '#E8F5E9'),
    ('[融合] 融合', '自体客体同步变化\n镜映→自体客体关系\n客体关系空间坍缩',
     C_FUSE, '#FFEBEE'),
    ('[湮灭] 湮灭', '自体或客体→0\n关系单元断裂\n无法维持关系',
     C_ANNI, '#ECEFF1'),
]
for i, (title, desc, tcol, bg) in enumerate(fates):
    cx = 0.5 + i * 3.15
    draw_rounded_box(ax4, cx, 0.0, 2.9, 1.2, '',
                     facecolor=bg, edgecolor=tcol, lw=2, alpha=0.95)
    ax4.text(cx + 1.45, 0.95, title, ha='center', fontsize=12, fontweight='bold', color=tcol)
    ax4.text(cx + 1.45, 0.45, desc, ha='center', fontsize=10, color='#333', linespacing=1.5)

# =====================================================
# 板块 5:核心命题 & 干预方向(⚠ 替换为 !)
# =====================================================
ax5 = fig.add_axes([0.06, 0.08, 0.88, 0.18])
ax5.set_xlim(0, 10); ax5.set_ylim(0, 2.0)
ax5.axis('off')

# 左:核心命题
draw_rounded_box(ax5, 0.1, 0.2, 4.7, 1.6,
    '核心命题\n\n'
    '① 关系稳定 ≠ 两个人"都好",而需要互补张力\n'
    '   "一山不容二虎,红花还需绿叶配"\n'
    '② 稳定组合:分享↔奉献、分享↔寄生、掠食↔奉献、掠食↔寄生\n'
    '③ 相似组合(同正/同负)倾向融合或湮灭',
    facecolor='#FFF8E1', edgecolor='#F9A825', fontsize=10.5,
    fontweight='normal', text_color='#4E342E', lw=2, alpha=0.95)

# 右:干预
draw_rounded_box(ax5, 5.1, 0.2, 4.7, 1.6,
    '干预方向(调两个旋钮)\n\n'
    '调 a(自我基调):通过成就/咨询/边界,把 a 从负推正\n'
    '调 b(互动模式):把零和消耗改成双赢合作\n'
    '! 只能改自己的参数 → 系统平衡点随之移动\n'
    '   对方要么跟随调整,要么关系走向湮灭',
    facecolor='#E3F2FD', edgecolor='#1565C0', fontsize=10.5,
    fontweight='normal', text_color='#1A237E', lw=2, alpha=0.95)

# 箭头连接
arrow(ax5, 4.8, 1.0, 5.1, 1.0, color='#F9A825', lw=2.5)

# ========== 保存到当前目录 ==========
plt.savefig('or_model_structure.png', dpi=180, bbox_inches='tight', facecolor=fig.get_facecolor())
print('done')
相关推荐
keep intensify1 小时前
最长有效括号
算法·leetcode·动态规划
dogstarhuang1 小时前
用 Doubao-Seed-Evolving + Python 免费写一个网页正文提取工具(实战教程)
爬虫·python·ai编程
CoderYanger1 小时前
A.每日一题:1979. 找出数组的最大公约数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
猫头虎2 小时前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作
心运软件2 小时前
Python实战:中国大学排行榜数据采集与可视化大屏
后端·python
长不胖的路人甲2 小时前
什么是赫夫曼树(哈夫曼树 / Huffman Tree)
python·算法·霍夫曼树
魔镜er3 小时前
03-张量
人工智能·pytorch·python
37.2℃9953 小时前
Claude Design哪个公司技术好
python·设计模式
Warren2Lynch3 小时前
掌握 UML 构造型、标记定义与标记值:面向领域特定建模的 UML 扩展全面指南
大数据·算法·uml