یک حل‌گر مدار ممکن است دو عدد خوش‌ظاهر برگرداند، اما جای مقاومت‌ها، جهت جریان یا واحدها اشتباه باشند. برای آزمودن آن، بهتر است شبکه‌ای کوچک با جواب دستی و مرجع مستقل انتخاب کنیم. این درس یک مدل تألیفیِ DC با دو ولتاژ مجهول و پنج مقاومت می‌سازد؛ سپس KCL، تراز توان و چند ویژگی محدود را کنار جواب مرجع بررسی می‌کند. هیچ مدار واقعی، SPICE یا محصول تجاری اجرا نشده است؛ هدف، حفاظت از صحت محاسبهٔ مهندسی است.

۱. توپولوژی و جهت‌ها را پیش از اعداد ثابت کنیم

دو گرهٔ مسی و سه مسیر جریان قراردادی روی یک مدل بی‌برق
تصویر مفهومی: دو گرهٔ مسی و سه مسیر جریان قراردادی روی یک مدل بی‌برق؛ بدون مقیاس عددی و مستقل از نتایج اجرای کد.

زمین مشترک، صفر ولتاژ است. منبع A ترمینالی با ولتاژ Va نسبت به زمین دارد و از طریق Ra به گرهٔ یک وصل است. منبع B نیز با Rb به گرهٔ دو می‌رسد. Rg1 از گرهٔ یک به زمین، Rg2 از گرهٔ دو به زمین و Rc میان دو گره قرار دارد. منفیِ هر دو منبع به همان زمین مرجع مربوط است؛ منابع، پتانسیل‌های ثابتِ معلوم‌اند و دو گرهٔ میانی مجهول می‌مانند.

ترتیب مقاومت‌های ورودی Ra، Rg1، Rb، Rg2 و Rc است؛ جابه‌جایی دو مقدار، معمولاً مدار دیگری می‌سازد. همهٔ مقاومت‌ها مثبت و در بازهٔ بستهٔ یک تا یک‌میلیون اهم‌اند. هر ولتاژ منبع بین صفر و صد ولت، شامل دو انتها، پذیرفته می‌شود. این دامنهٔ آموزشیِ حل‌گر است، نه محدودهٔ ایمن یک برد یا مشخصات قطعه؛ سیم، مقاومت داخلی منبع و تغییر دما مدل نشده‌اند.

u و v برحسب ولت‌اند. جریان منبع از ترمینال معلوم به گرهٔ مجهول مثبت تعریف می‌شود؛ جریان زمین از گره به زمین و جریان رابط از گرهٔ یک به دو مثبت است. جریان منفی فقط خلاف جهت مرجع است. رابطهٔ جریان هر مقاومت، اختلاف ولتاژ دو سر آن تقسیم بر مقاومت است؛ در نتیجه واحد جریان آمپر خواهد بود و علامت آن را نباید خودکار قدرمطلق گرفت.

۲. از KCL تا دستگاه رساناییِ دو مجهول

وزن رسانایی با قطعات مقاومتی و دو صفحهٔ جمع‌بندی مکانیکی
تصویر مفهومی: وزن رسانایی با قطعات مقاومتی و دو صفحهٔ جمع‌بندی مکانیکی؛ بدون مقیاس عددی و مستقل از نتایج اجرای کد.

روش گره در درس MIT 6.002 انتخاب زمین، مجهول‌گرفتن ولتاژ گره‌ها و جایگذاری قانون عنصر در KCL را توضیح می‌دهد. برای شبکهٔ خودمان، سطر اول برابر (u−Va)/Ra + u/Rg1 + (u−v)/Rc = ۰ است؛ سطر دوم نیز (v−Vb)/Rb + v/Rg2 + (v−u)/Rc = ۰ می‌شود.

با نام‌گذاری رسانایی‌ها به شکل g=۱/R، درایهٔ قطری اول ga+g1+gc و قطری دوم gb+g2+gc است؛ دو درایهٔ غیراصلی منفی gc هستند. سمت راست Va*ga و Vb*gb است. رسانایی، زیمنس است؛ ضرب آن در ولت، آمپر می‌دهد. در کد، نام determinant_siemens_squared نیز یادآوری می‌کند که دترمینانِ این ماتریس دو در دو، واحد زیمنس مربع دارد؛ یک عدد بی‌واحدِ دلخواه نیست.

در حساب دقیق، دترمینان را می‌توان مجموع (ga+g1)*(gb+g2) و gc*(ga+g1+gb+g2) نوشت. همهٔ سهم‌ها مثبت‌اند؛ اتصال‌های مثبت به زمین و ترمینال‌های معلوم، شبکهٔ شناور ایجاد نمی‌کنند. کد از همین صورت جمعی استفاده می‌کند تا دو جملهٔ بزرگ شامل gc² را از هم کم نکند. این انتخاب، درمان عمومیِ بدشرطیِ تمام دستگاه‌های خطی یا تضمین گردکردن درستِ همهٔ خروجی‌ها نیست.

۳. کد کامل با واحد، مرز ورودی و شاهد مستقل

ورودی‌های مقاومت و منبع در جعبه‌های جدا با مسیر اعتبارسنجی روشن
تصویر مفهومی: ورودی‌های مقاومت و منبع در جعبه‌های جدا با مسیر اعتبارسنجی روشن؛ بدون مقیاس عددی و مستقل از نتایج اجرای کد.

ورودی فقط list یا tuple دقیق با پنج مقاومت و دو منبع است. هر مقدار باید int یا float دقیق باشد و پس از تبدیل به float متناهی و داخل دامنه بماند؛ bool، رشته، مختلط، NaN و بی‌نهایت رد می‌شوند. واحدها باید دقیقاً ohm و V باشند؛ برچسب kohm یا mV تبدیل خودکار ایجاد نمی‌کند. اگر عدد میلی‌ولت را با برچسب V بفرستیم، تابع از نیت پنهان ما آگاه نمی‌شود.

"""Original bounded ideal two-node DC resistive network with independent oracle."""
import itertools
import json
import math
import platform
from fractions import Fraction


def _number(value, low, high):
    if type(value) not in (int, float):
        raise TypeError('expected exact int or float, not bool/coercible values')
    try:
        value = float(value)
    except OverflowError as error:
        raise ValueError('input outside float representation') from error
    if not math.isfinite(value) or not low <= value <= high:
        raise ValueError('input outside authored finite bounds')
    return value


def solve_network(resistances, sources, resistance_unit='ohm', voltage_unit='V'):
    if type(resistance_unit) is not str or resistance_unit != 'ohm' or type(voltage_unit) is not str or voltage_unit != 'V':
        raise ValueError('units must explicitly be ohm and V')
    if type(resistances) not in (list, tuple) or len(resistances) != 5:
        raise ValueError('resistances ordered Ra,Rg1,Rb,Rg2,Rc, length exactly five')
    if type(sources) not in (list, tuple) or len(sources) != 2:
        raise ValueError('sources ordered Va,Vb, length exactly two')
    ra, rg1, rb, rg2, rc = (_number(x, 1, 10**6) for x in resistances)
    va, vb = (_number(x, 0, 100) for x in sources)
    ga, g1, gb, g2, gc = (1 / x for x in (ra, rg1, rb, rg2, rc))
    a = math.fsum((ga, g1, gc))
    b = math.fsum((gb, g2, gc))
    j1, j2 = va * ga, vb * gb
    # Expanded positive determinant avoids subtracting the dominant gc**2 terms.
    determinant = (ga + g1) * (gb + g2) + gc * math.fsum((ga, g1, gb, g2))
    if not math.isfinite(determinant) or determinant <= 0:
        raise ArithmeticError('invalid determinant for authored passive topology')
    u = math.fsum((j1 * b, gc * j2)) / determinant
    v = math.fsum((a * j2, gc * j1)) / determinant
    ia, ib = (va - u) / ra, (vb - v) / rb  # source terminal toward unknown node
    ig1, ig2, ic = u / rg1, v / rg2, (u - v) / rc  # ground branches and node1 -> node2
    residuals = [math.fsum((ia, -ig1, -ic)), math.fsum((ib, -ig2, ic))]
    resistor_powers = [(va - u)**2 / ra, u*u / rg1, (vb - v)**2 / rb, v*v / rg2, (u - v)**2 / rc]
    supplied = [va * ia, vb * ib]  # positive supplied, negative absorbed by ideal source
    outputs = [u, v, ia, ib, ig1, ig2, ic, determinant] + residuals + resistor_powers + supplied
    if not all(math.isfinite(x) for x in outputs):
        raise ArithmeticError('nonfinite derived output')
    return {'node_voltage_v': [u, v], 'current_a': {'source_a_to_node1': ia, 'source_b_to_node2': ib,
             'node1_to_ground': ig1, 'node2_to_ground': ig2, 'node1_to_node2': ic},
            'kcl_residual_a': residuals, 'resistor_power_w': resistor_powers,
            'source_supplied_power_w': supplied, 'total_resistor_power_w': math.fsum(resistor_powers),
            'total_source_supplied_power_w': math.fsum(supplied), 'determinant_siemens_squared': determinant}


def reference_fraction(resistances, sources):
    # Separate exact Gaussian elimination, not the production determinant formula.
    ra, rg1, rb, rg2, rc = (Fraction.from_float(float(x)) for x in resistances)
    va, vb = (Fraction.from_float(float(x)) for x in sources)
    a = 1/ra + 1/rg1 + 1/rc
    b = -1/rc
    c = -1/rc
    d = 1/rb + 1/rg2 + 1/rc
    p, q = va/ra, vb/rb
    ratio = c/a
    v = (q - ratio*p) / (d - ratio*b)
    u = (p - b*v) / a
    return u, v


def _raises(expected, function, *args):
    try:
        function(*args)
    except expected:
        return True
    return False


def _close(x, y, absolute=1e-10, relative=1e-12):
    return math.isclose(x, float(y), abs_tol=absolute, rel_tol=relative)


def run_example():
    resistances = [1000, 1000, 1000, 1000, 1000]
    sources = [12, 4]
    hand = solve_network(resistances, sources)
    original = (resistances.copy(), sources.copy())
    oracle_cases = []
    errors = []
    properties = []
    for rr in itertools.product((100, 1000), repeat=5):
        for vv in ((12, 4), (3, 8), (0, 0)):
            got = solve_network(rr, vv)
            ref = reference_fraction(rr, vv)
            oracle_cases.append(all(_close(a, b) for a, b in zip(got['node_voltage_v'], ref)))
            errors.extend(abs(a-float(b)) for a, b in zip(got['node_voltage_v'], ref))
            properties.append(all(-1e-12 <= x <= max(vv)+1e-12 for x in got['node_voltage_v'])
                              and all(p >= 0 for p in got['resistor_power_w'])
                              and _close(got['total_resistor_power_w'], got['total_source_supplied_power_w'], 1e-10))
    scaled_r = solve_network([r*10 for r in resistances], sources)
    scaled_v = solve_network(resistances, [x*2 for x in sources])
    left = solve_network(resistances, [12, 0])
    right = solve_network(resistances, [0, 4])
    mirrored = solve_network([200, 300, 700, 900, 1100], [3, 11])
    swapped = solve_network([700, 900, 200, 300, 1100], [11, 3])
    symmetric = solve_network(resistances, [10, 10])
    zero = solve_network(resistances, [0, 0])
    absorbing = solve_network(resistances, [12, 1])
    edges = [solve_network(rr, vv) for rr in ((1,)*5, (10**6,)*5, (10**6,10**6,10**6,10**6,1)) for vv in ((100,0),(0,100))]
    checks = {
        'hand_five_and_three_volt_node_solution': all(_close(a, b, 1e-14, 0) for a,b in zip(hand['node_voltage_v'], (5,3))),
        'hand_branch_directions_and_milliampere_values': all(_close(x,y,1e-17,0) for x,y in zip(hand['current_a'].values(), (.007,.001,.005,.003,.002))),
        'hand_resistor_and_total_eighty_eight_milliwatt_balance': all(_close(x,y,1e-16,0) for x,y in zip(hand['resistor_power_w'], (.049,.025,.001,.009,.004)))
            and _close(hand['total_resistor_power_w'], .088, 1e-16, 0) and _close(hand['total_source_supplied_power_w'], .088, 1e-16, 0),
        'hand_kcl_residuals_are_ampere_not_relative_voltage_error': all(abs(x)<1e-17 for x in hand['kcl_residual_a']),
        'independent_exact_gaussian_oracle_ninety_six_network_cases': len(oracle_cases)==96 and all(oracle_cases),
        'passive_bounds_nonnegative_dissipation_and_signed_power_balance_fixture_grid': all(properties),
        'mirrored_node_numbering_swaps_voltages_and_reverses_cross_current': all(_close(x,y) for x,y in zip(mirrored['node_voltage_v'],reversed(swapped['node_voltage_v'])))
            and _close(mirrored['current_a']['node1_to_node2'], -swapped['current_a']['node1_to_node2']),
        'common_resistance_scaling_preserves_voltage_and_scales_current_power': all(_close(x,y) for x,y in zip(hand['node_voltage_v'],scaled_r['node_voltage_v']))
            and all(_close(x/10,y) for x,y in zip(hand['current_a'].values(),scaled_r['current_a'].values()))
            and _close(hand['total_resistor_power_w']/10,scaled_r['total_resistor_power_w']),
        'source_scaling_doubles_voltage_current_and_quadruples_power': all(_close(2*x,y) for x,y in zip(hand['node_voltage_v'],scaled_v['node_voltage_v']))
            and all(_close(2*x,y) for x,y in zip(hand['current_a'].values(),scaled_v['current_a'].values()))
            and _close(4*hand['total_resistor_power_w'],scaled_v['total_resistor_power_w']),
        'linear_superposition_nodes_match_two_independent_source_cases': all(_close(x+y,z) for x,y,z in zip(left['node_voltage_v'],right['node_voltage_v'],hand['node_voltage_v'])),
        'zero_sources_give_zero_nodes_currents_and_powers': zero['node_voltage_v']==[0,0] and all(x==0 for x in zero['current_a'].values()) and zero['total_resistor_power_w']==0,
        'equal_symmetric_nodes_have_zero_cross_current_in_this_fixture': all(_close(x,5,1e-14,0) for x in symmetric['node_voltage_v'])
            and symmetric['node_voltage_v'][0]==symmetric['node_voltage_v'][1] and symmetric['current_a']['node1_to_node2']==0,
        'positive_voltage_source_can_absorb_negative_supplied_power': absorbing['current_a']['source_b_to_node2'] < 0 and absorbing['source_supplied_power_w'][1] < 0
            and _close(absorbing['total_resistor_power_w'], absorbing['total_source_supplied_power_w']),
        'bounded_extreme_resistance_and_source_endpoints_produce_finite_outputs': len(edges)==6 and all(all(math.isfinite(x) for x in e['node_voltage_v']) for e in edges)
            and all(all(0 <= x <= 100 for x in e['node_voltage_v']) for e in edges),
        'invalid_numeric_types_and_nonfinite_values_rejected': all(_raises((TypeError,ValueError),solve_network,[x,1000,1000,1000,1000],sources)
            for x in (True,'1000',None,1+0j,math.nan,math.inf,10**400)),
        'resistor_positive_finite_range_and_source_voltage_range_enforced': all(_raises(ValueError,solve_network,[x,1000,1000,1000,1000],sources) for x in (0,-1,.999,1000001))
            and all(_raises(ValueError,solve_network,resistances,[x,4]) for x in (-.001,100.001,math.nan,math.inf))
            and _raises(TypeError,solve_network,resistances,[False,4]),
        'container_lengths_and_unit_codes_cannot_be_silently_coerced': all(_raises(ValueError,solve_network,x,sources) for x in ({},[1000]*4,[1000]*6))
            and _raises(ValueError,solve_network,resistances,[12]) and _raises(ValueError,solve_network,resistances,sources,'kohm','V')
            and _raises(ValueError,solve_network,resistances,sources,'ohm','mV'),
        'input_lists_unchanged_and_tuple_result_matches': (resistances,sources)==original and solve_network(tuple(resistances),tuple(sources))==hand,
    }
    assert len(checks)==18 and all(type(v)is bool and v for v in checks.values())
    return {'runtime': {'python':platform.python_version(),'arithmetic':'stdlib float primary; exact Fraction Gaussian reference'},
            'contract': {'resistance_order_ohm':['Ra sourceA-node1','Rg1 node1-ground','Rb sourceB-node2','Rg2 node2-ground','Rc node1-node2'],
                         'resistance_each_inclusive_ohm':[1,1000000],'source_each_inclusive_v':[0,100],
                         'model':'two unknown DC nodes, common ground, five positive ideal resistors, two fixed source terminal potentials; no dependent/nonlinear/reactive element'},
            'metrics': {'hand_network':hand,'source_absorbing_example':absorbing,'independent_gaussian_reference_cases':len(oracle_cases),
                        'max_reference_node_difference_v':max(errors), 'comparison_tolerance':{'node_abs_v':1e-10,'node_relative':1e-12,'power_abs_w':1e-10}},
            'checks':checks,
            'limitations':['Bounded ideal DC teaching topology only, not SPICE, measured hardware or commercial simulation validation.',
                           'Strictly positive ground/source conductances ensure nonsingular exact matrix; determinant expansion is not a universal conditioning or correct-rounding cure.',
                           'Tiny differences of nearly equal node voltages can still lose relative precision in cross-current; zero cross-current only claimed for symmetric fixture.',
                           'Power signed positive supplied at ideal voltage sources; an individual source may absorb power, while resistor dissipation is nonnegative.',
                           'Numeric input first converted to float; no original decimal recovery, component tolerance, thermal/safety sizing, transient or physical uncertainty claim.']}


if __name__=='__main__':
    print(json.dumps(run_example(),ensure_ascii=False,indent=2))

مرجع جدا با Fraction.from_float پایتون، مقدار دقیقِ همان floatهای تبدیل‌شده را می‌گیرد و حذف گاوسی انجام می‌دهد. مسیر اصلی فرمول بستهٔ دو در دو و حساب float است. این تفاوت محاسباتی، شاهد مستقلی برای پیاده‌سازی فراهم می‌کند؛ هر دو همچنان بر معادلهٔ فیزیکیِ تألیفی تکیه دارند. مرجع، املای اعشاریِ پیش از تبدیل یا رفتار یک مقاومت واقعی را بازیابی نمی‌کند.

گردکردن همچنان وجود دارد. به‌ویژه وقتی دو ولتاژ گره بسیار نزدیک‌اند، جریان رابط از تفاضل آن‌ها ساخته می‌شود و دقت نسبیِ این جریان کوچک ممکن است افت کند. صفر بودن جریان رابط فقط برای fixture متقارنِ بررسی‌شده گزارش می‌شود. مثبت بودن دترمینان و کوچک بودن باقیمانده، جای مقایسهٔ ولتاژها با مرجع مستقل یا بررسی حساسیت مسئله را نمی‌گیرد.

۴. جواب دستی، تراز توان و هجده گروه آزمون

مقایسهٔ مستقلِ گره‌ها و تراز توان با دو ابزار بی‌نشان
تصویر مفهومی: مقایسهٔ مستقلِ گره‌ها و تراز توان با دو ابزار بی‌نشان؛ بدون مقیاس عددی و مستقل از نتایج اجرای کد.

همهٔ مقاومت‌ها را هزار اهم و منابع را دوازده و چهار ولت بگذارید. معادلات در مقیاس میلی‌آمپر به ۳u−v=۱۲ و −u+۳v=۴ می‌رسند؛ جواب دستی u=۵ و v=۳ ولت است. جریان دو منبع هفت و یک میلی‌آمپر، جریان‌های زمین پنج و سه میلی‌آمپر و جریان رابط دو میلی‌آمپر می‌شوند. هر دو تراز جریان با همین جهت‌ها برقرارند.

طبق رابطهٔ توان و قانون اهم، اتلاف هر مقاومت از مربع افت ولتاژ تقسیم بر R به دست می‌آید. پنج سهمِ مثال، در ترتیب ورودی، ۴۹، ۲۵، یک، نه و چهار میلی‌وات‌اند؛ جمع ۸۸ میلی‌وات است. توان تأمین‌شدهٔ منابع نیز دوازده ضرب‌در هفت و چهار ضرب‌در یک میلی‌وات می‌شود؛ همان ۸۸، با واحد وات در خروجی برنامه ثبت شده است.

{
  "runtime": {
    "python": "3.14.5",
    "arithmetic": "stdlib float primary; exact Fraction Gaussian reference"
  },
  "contract": {
    "resistance_order_ohm": [
      "Ra sourceA-node1",
      "Rg1 node1-ground",
      "Rb sourceB-node2",
      "Rg2 node2-ground",
      "Rc node1-node2"
    ],
    "resistance_each_inclusive_ohm": [
      1,
      1000000
    ],
    "source_each_inclusive_v": [
      0,
      100
    ],
    "model": "two unknown DC nodes, common ground, five positive ideal resistors, two fixed source terminal potentials; no dependent/nonlinear/reactive element"
  },
  "metrics": {
    "hand_network": {
      "node_voltage_v": [
        5.000000000000001,
        3.0
      ],
      "current_a": {
        "source_a_to_node1": 0.006999999999999999,
        "source_b_to_node2": 0.001,
        "node1_to_ground": 0.005000000000000001,
        "node2_to_ground": 0.003,
        "node1_to_node2": 0.002000000000000001
      },
      "kcl_residual_a": [
        -2.6020852139652106e-18,
        8.673617379884035e-19
      ],
      "resistor_power_w": [
        0.04899999999999999,
        0.025000000000000012,
        0.001,
        0.009,
        0.0040000000000000036
      ],
      "source_supplied_power_w": [
        0.08399999999999999,
        0.004
      ],
      "total_resistor_power_w": 0.08800000000000001,
      "total_source_supplied_power_w": 0.088,
      "determinant_siemens_squared": 8e-06
    },
    "source_absorbing_example": {
      "node_voltage_v": [
        4.625,
        1.8750000000000002
      ],
      "current_a": {
        "source_a_to_node1": 0.007375,
        "source_b_to_node2": -0.0008750000000000002,
        "node1_to_ground": 0.004625,
        "node2_to_ground": 0.0018750000000000001,
        "node1_to_node2": 0.00275
      },
      "kcl_residual_a": [
        0.0,
        -5.421010862427522e-19
      ],
      "resistor_power_w": [
        0.054390625,
        0.021390625,
        0.0007656250000000005,
        0.003515625000000001,
        0.0075625
      ],
      "source_supplied_power_w": [
        0.0885,
        -0.0008750000000000002
      ],
      "total_resistor_power_w": 0.087625,
      "total_source_supplied_power_w": 0.087625,
      "determinant_siemens_squared": 8e-06
    },
    "independent_gaussian_reference_cases": 96,
    "max_reference_node_difference_v": 3.552713678800501e-15,
    "comparison_tolerance": {
      "node_abs_v": 1e-10,
      "node_relative": 1e-12,
      "power_abs_w": 1e-10
    }
  },
  "checks": {
    "hand_five_and_three_volt_node_solution": true,
    "hand_branch_directions_and_milliampere_values": true,
    "hand_resistor_and_total_eighty_eight_milliwatt_balance": true,
    "hand_kcl_residuals_are_ampere_not_relative_voltage_error": true,
    "independent_exact_gaussian_oracle_ninety_six_network_cases": true,
    "passive_bounds_nonnegative_dissipation_and_signed_power_balance_fixture_grid": true,
    "mirrored_node_numbering_swaps_voltages_and_reverses_cross_current": true,
    "common_resistance_scaling_preserves_voltage_and_scales_current_power": true,
    "source_scaling_doubles_voltage_current_and_quadruples_power": true,
    "linear_superposition_nodes_match_two_independent_source_cases": true,
    "zero_sources_give_zero_nodes_currents_and_powers": true,
    "equal_symmetric_nodes_have_zero_cross_current_in_this_fixture": true,
    "positive_voltage_source_can_absorb_negative_supplied_power": true,
    "bounded_extreme_resistance_and_source_endpoints_produce_finite_outputs": true,
    "invalid_numeric_types_and_nonfinite_values_rejected": true,
    "resistor_positive_finite_range_and_source_voltage_range_enforced": true,
    "container_lengths_and_unit_codes_cannot_be_silently_coerced": true,
    "input_lists_unchanged_and_tuple_result_matches": true
  },
  "limitations": [
    "Bounded ideal DC teaching topology only, not SPICE, measured hardware or commercial simulation validation.",
    "Strictly positive ground/source conductances ensure nonsingular exact matrix; determinant expansion is not a universal conditioning or correct-rounding cure.",
    "Tiny differences of nearly equal node voltages can still lose relative precision in cross-current; zero cross-current only claimed for symmetric fixture.",
    "Power signed positive supplied at ideal voltage sources; an individual source may absorb power, while resistor dissipation is nonnegative.",
    "Numeric input first converted to float; no original decimal recovery, component tolerance, thermal/safety sizing, transient or physical uncertainty claim."
  ]
}

کد با Python 3.14.5 اجرا شده است. نودوشش شبکه با مرجع گویا مقایسه شده‌اند؛ بیشترین اختلاف ولتاژ حدود ۳٫۵۵ ضرب‌در ده به توان منفی پانزده ولت شد. این شبکه‌ها یک گروه از هجده گروه‌اند. حد مقایسهٔ عمومیِ ولتاژ، مطلق ده به توان منفی ده ولت به‌همراه نسبی ده به توان منفی دوازده است؛ این‌ها تلورانس همین آزمون‌اند، نه دقت دستگاه یا کران خطای عمومی حل‌گر.

ویژگی‌های مکمل شامل تقارن، جمع آثار دو منبع، صفرشدن پاسخ با منابع صفر و مقیاس‌کردن مشترک مقاومت‌ها هستند. تراز توان نیز با علامتِ منبع محاسبه می‌شود: با منابع دوازده و یک ولت، منبع دوم حدود ۰٫۸۷۵ میلی‌وات جذب می‌کند، یعنی توان تأمین‌شده‌اش منفی است. بحث علامت توان منبع در OpenStax همین امکان جذب را توضیح می‌دهد؛ مثبت بودن ولتاژ، تأمین‌کننده بودن هر منبع را ثابت نمی‌کند.

حل مدار غیرخطی با bisection مسئلهٔ دیگری با توقف تکراری دارد و آزمون برازش جریان و ولتاژ پارامتر را از داده تخمین می‌زند. اینجا پارامترها معلوم‌اند. منابع در ۲۴ مهر ۱۴۰۵ خوانده شدند؛ آرشیو MIT مربوط به بهار ۲۰۰۷ و سرصفحهٔ جزوه پاییز ۲۰۰۰ است. کتاب OpenStax سال ۲۰۱۶ منتشر شده؛ خبر یا آزمایش تازه‌ای گزارش نمی‌شود.

۵. چهار پرسش با پاسخ کامل

جابه‌جایی متقارن دو گره و تغییر مقیاس مشترک مقاومت‌ها
تصویر مفهومی: جابه‌جایی متقارن دو گره و تغییر مقیاس مشترک مقاومت‌ها؛ بدون مقیاس عددی و مستقل از نتایج اجرای کد.

پرسش اول: چرا جریان رابط مثال دو میلی‌آمپر است؟ پاسخ: جهت مرجع از گرهٔ یک به گرهٔ دو است؛ (۵−۳) ولت تقسیم بر هزار اهم، ۰٫۰۰۲ آمپر می‌دهد. جابه‌جایی جهت مرجع، علامت را معکوس می‌کند.

پرسش دوم: با ده‌برابر شدن همهٔ مقاومت‌ها چه می‌شود؟ پاسخ: با همان منابع ایدئال، ولتاژ گره‌ها ثابت، جریان‌ها یک‌دهم و اتلاف کل یک‌دهم می‌شود. این ویژگی به همین مدل خطی وابسته است.

پرسش سوم: توان منفیِ یک منبع خطاست؟ پاسخ: در قرارداد توان تأمین‌شده، منفی یعنی جذب توان. نمونهٔ منبع یک‌ولتی این حالت را نشان می‌دهد؛ جمع جبریِ منابع با اتلافِ مثبت مقاومت‌ها مقایسه می‌شود.

پرسش چهارم: KCL نزدیک صفر مدار واقعی را تأیید می‌کند؟ پاسخ: خیر؛ باقیمانده فقط سازگاری عددی همین معادلات را کنترل می‌کند. توپولوژی، واحد، جواب مرجع، تلورانس قطعه، گرمایش و رفتار گذرا مسائل جدا هستند؛ این درس سخت‌افزار یا ایمنی را تأیید نمی‌کند.

منابع و مطالعهٔ بیشتر

بررسی منابع: ۲۴ مهر ۱۴۰۵. تحلیل‌ها و پیشنهادهای اجرایی، جمع‌بندی نویسنده‌اند.