Fractional Zener Liquid-Liquid (Fractional)

Quick Reference

  • Use when: Liquid with broad multi-order fractional dispersions, complex viscoelastic behavior

  • Parameters: 6 (\(c_1, c_2, \alpha, \beta, \gamma, \tau\))

  • Key equation: \(G^*(\omega) = \frac{c_1(i\omega)^{\alpha}}{1 + (i\omega\tau)^{\beta}} + c_2(i\omega)^{\gamma}\)

  • Test modes: Oscillation, relaxation, creep

  • Material examples: Complex fluids with multiple fractional relaxation mechanisms

Fractional Calculus Fundamentals

This model uses fractional calculus for power-law viscoelastic behavior. For mathematical foundations—SpringPot element, Mittag-Leffler functions, physical meaning of fractional order \(\alpha\), and derivation from molecular theory—see:

/user_guide/fractional_viscoelasticity_reference

Notation Guide

Symbol

Units

Description

\(c_1\)

Pa·s\(^{\alpha}\)

First SpringPot constant (high-frequency behavior)

\(c_2\)

Pa·s\(^{\gamma}\)

Second SpringPot constant (low-frequency behavior)

\(\alpha\)

dimensionless

First fractional order (high-frequency power-law)

\(\beta\)

dimensionless

Second fractional order (crossover character)

\(\gamma\)

dimensionless

Third fractional order (low-frequency power-law)

\(\tau\)

s

Relaxation time (regime transition)

\(E^{\delta}_{\mu,\nu}(t)\)

dimensionless

Prabhakar (generalized Mittag-Leffler) function

Overview

The most general three-element fractional Zener form combining two SpringPots and a viscous time constant. It models liquid-like behavior with broad, multi-order fractional dispersions.

Physical Foundations

The Fractional Zener Liquid-Liquid (FZLL) represents the most general fractional viscoelastic model with three independent fractional orders:

Mechanical Configuration:

[SpringPot (c₁, α, β, τ)] ---- parallel ---- [SpringPot (c₂, γ)]

Microstructural Interpretation:

  • Primary branch ( \(c_1, \alpha, \beta\) ): Captures main relaxation mechanism with characteristic time \(\tau\). The two orders \(\alpha\) and \(\beta\) control high-frequency and crossover behavior, respectively.

  • Secondary branch ( \(c_2, \gamma\) ): Provides additional relaxation mode at different timescale. Order \(\gamma\) controls low-frequency terminal behavior.

  • Liquid-like: No equilibrium modulus, material flows under stress

  • Multi-scale relaxation: Three orders allow hierarchical relaxation processes

This model is only needed for materials with extremely complex rheology that cannot be described by simpler fractional models (FMG, FML, FZSS with 3-4 parameters).

Governing Equations

Frequency domain (complex modulus; analytical):

\[ G^{*}(\omega) \;=\; \frac{c_1\,(i\omega)^{\alpha}}{1 + (i\omega\tau)^{\beta}} \;+\; c_2\,(i\omega)^{\gamma}. \]

Time domain (relaxation modulus; general case):

\[ G(t) \;=\; \mathcal{L}^{-1}\!\left\{G^{*}(s)\right\}(t) \;\;\text{which, for distinct orders, involves generalized Mittag\text{-}Leffler (Prabhakar) functions } E^{\delta}_{\mu,\nu}(t) . \]

Special cases (e.g., \(\beta=\alpha\), \(c_2=0\)) reduce to two-parameter Mittag-Leffler forms.

Parameters

Parameters

Name

Symbol

Units

Bounds

Notes

c1

\(c_1\)

Pa·sα

[1e-3, 1e9]

First SpringPot constant

c2

\(c_2\)

Pa·sγ

[1e-3, 1e9]

Second SpringPot constant

alpha

\(\alpha\)

dimensionless

[0, 1]

First fractional order

beta

\(\beta\)

dimensionless

[0, 1]

Second fractional order

gamma

\(\gamma\)

dimensionless

[0, 1]

Third fractional order

tau

\(\tau\)

s

[1e-6, 1e6]

Relaxation time

Validity and Assumptions

  • Linear viscoelastic assumption; strain amplitudes remain small.

  • Isothermal, time-invariant material parameters throughout the experiment.

  • Supported RheoJAX test modes: relaxation, creep, oscillation.

  • Fractional orders stay within (0, 1) to keep kernels causal and bounded.

Regimes and Behavior

  • Liquid-like at low \(\omega\) (no equilibrium plateau).

  • Multiple fractional slopes in \(G'\) and \(G''\) controlled by \(\alpha,\beta,\gamma\).

  • Captures complex crossover patterns not possible with single-order models.

Limiting Behavior

  • \(\alpha, \beta, \gamma \to 1\): tends to classical viscoelastic liquid combinations.

  • \(c_2 \to 0\): reduces to a generalized fractional Maxwell form.

  • Equal orders collapse to two-parameter Mittag-Leffler responses.

What You Can Learn

This section explains what insights you can extract from fitting the most general three-order Fractional Zener Liquid-Liquid model, emphasizing the hierarchical multi-scale relaxation processes captured by three independent fractional orders.

Parameter Interpretation

Three Fractional Orders ( \(\alpha, \beta, \gamma\) ):

Each order controls a different frequency/time regime, enabling characterization of hierarchical relaxation. All three are bounded between 0 (solid-like) and 1 (liquid-like).

  • \(\alpha\): High-frequency power-law slope. Controls short-time/fast relaxation behavior.

  • \(\beta\): Crossover behavior near \(\tau\). Governs the transition between primary and secondary relaxation mechanisms.

  • \(\gamma\): Low-frequency/long-time terminal behavior. Determines terminal flow characteristics.

For graduate students: The presence of three independent orders suggests hierarchical microstructural relaxation mechanisms operating at different scales—e.g., segmental motion (\(\alpha\)), chain relaxation (\(\beta\)), and network rearrangement (\(\gamma\)). For practitioners: Each order corresponds to a distinct timescale in material response. Map \(\alpha, \beta, \gamma\) to processing conditions (mixing, extrusion, curing) to optimize manufacturing.

SpringPot Constants ( \(c_1, c_2\) ):

Determine the relative strength of the two parallel relaxation branches.

  • \(c_1/c_2\) > 10: Primary branch (\(\alpha, \beta\)) dominates; secondary (\(\gamma\)) is a correction

  • \(c_1/c_2 \approx 1\): Both mechanisms contribute equally; true two-mode behavior

  • \(c_1/c_2\) < 0.1: Secondary branch (\(\gamma\)) dominates; consider simpler model

For graduate students: The ratio \(c_1/c_2\) relates to the partition of energy dissipation between fast (primary) and slow (secondary) mechanisms. For practitioners: High \(c_1/c_2\) means short-time response is critical; low \(c_1/c_2\) emphasizes long-time flow.

Relaxation Time ( \(\tau\) ):

Characteristic timescale separating primary and secondary relaxation regimes.

For graduate students: \(\tau\) marks the crossover frequency \(\omega \approx 1/\tau\) where the dominant relaxation mechanism shifts. For practitioners: Compare \(\tau\) to process timescales to determine which regime governs product performance.

When to Use This Model

This 6-parameter model is the most flexible fractional Zener variant. Use only when:

  1. Simpler models fail: If 3-4 parameter fractional models (FMG, FML, FZSS) show systematic deviations

  2. Multiple distinct power-law regimes: Data shows different slopes \(\alpha, \beta, \gamma\) in separate frequency decades

  3. Complex fluids: Polymer blends, filled systems, colloidal suspensions, or hierarchical structures

  4. High-quality data: At least 5 decades in frequency with >100 points

Critical Warning: With 6 parameters, overfitting is highly probable. Always compare to simpler models using information criteria (AIC, BIC). Prefer simpler models unless FZLL provides statistically significant improvement (\(\Delta\text{AIC}\) > 10).

Material Classification

Multi-Order Interpretation from FZLL Parameters

Order Pattern

Physical Interpretation

Material Examples

\(\alpha \approx \beta \approx \gamma\)

Single relaxation mechanism

Use simpler FMG/FML instead

\(\alpha < \beta < \gamma\) (ascending)

Hierarchical fast-to-slow relaxation

Polymer solutions, micellar systems

\(\alpha > \gamma, \beta\) intermediate

Two-scale relaxation

Filled polymers, composites

\(|\alpha - \gamma|\) > 0.5, any \(\beta\)

Extreme spectrum breadth

Complex biomaterials, blends

Parameter Bounds and Physical Meaning

Parameter

\(\to 0\) Limit

\(\to 1\) Limit

Typical Range

\(\alpha\)

Solid-like (fast)

Viscous (fast)

0.3-0.7

\(\beta\)

Elastic crossover

Viscous crossover

0.2-0.8

\(\gamma\)

Solid-like (slow)

Newtonian terminal

0.5-0.95 (liquid)

Fitting Guidance

Recommended Data Collection:

  1. Frequency sweep (SAOS): 5+ decades to resolve multiple power-law regimes

  2. High data quality: 100+ points, minimal noise (6 parameters require excellent data)

  3. Test amplitude: Within LVR (< 5% strain)

  4. Temperature: Constant ±0.05°C (stringent for complex models)

Initialization Strategy:

# Requires careful analysis of multi-regime behavior
# Start from simpler model fits (FMG, FML) and add complexity
# Use hierarchical fitting: fit 3-parameter model first,
# then add additional parameters

Model Selection:

  • Critical: Only use FZLL if simpler models (3-4 parameters) fail

  • Justification: Compare AIC/BIC to FMG, FML, FZSS

  • Validation: Cross-validate to ensure not overfitting

  • Parsimony: Prefer simpler models unless data clearly requires complexity

Common Pitfalls:

  • Overfitting: Most common issue with 6-parameter models

  • Parameter non-uniqueness: Multiple parameter sets may fit equally well

  • Poor conditioning: Optimization may not converge reliably

  • Interpretation difficulty: Hard to extract physical meaning from 6 parameters

Troubleshooting Table:

Common Issues and Solutions

Issue

Likely Cause

Solution

Fit unstable across runs

Multiple local minima

Use hierarchical fitting from simpler models

High parameter correlations

Model too flexible

Reduce to 4-parameter FZSS or FMG

Poor AIC vs simpler models

Overfitting

Prefer 3-4 parameter models

\(\alpha \approx \beta \approx \gamma\)

Single relaxation mode

Use FMG or FML instead

\(c_2/c_1 < 0.01\) or \(> 100\)

One branch dominates

Simplify to single-branch model

Fit diverges

Poor initialization

Start from FMG fit, add complexity

Non-physical parameters

Data quality insufficient

Need 5+ decades, 100+ points

Systematic residuals

Wrong model class

Consider GMM or different framework

Model Selection Guidelines

Critical Decision Tree:

Use FZLL only if ALL of the following are true:

  1. Data quality: 5+ decades in frequency, >100 points, SNR > 20 dB

  2. Simpler models fail: FMG/FML show systematic deviations (\(R^2\) < 0.95)

  3. Multiple power-law regimes: Clearly distinct slopes \(\alpha, \beta, \gamma\) in log-log plot

  4. Statistical justification: \(\Delta\text{AIC}\) > 10 compared to best 4-parameter model

  5. Physical interpretation: Can explain three orders from microstructure

Comparison Workflow:

from rheojax.models import (FractionalMaxwellGel,
                             FractionalMaxwellLiquid,
                             FractionalZenerSolidSolid,
                             FractionalZenerLiquidLiquid)

models = {
    'FMG': FractionalMaxwellGel(),
    'FML': FractionalMaxwellLiquid(),
    'FZSS': FractionalZenerSolidSolid(),
    'FZLL': FractionalZenerLiquidLiquid(),
}

results = {}
for name, model in models.items():
    model.fit(data)
    results[name] = {
        'R2': model.r_squared,
        'AIC': compute_aic(model),
        'BIC': compute_bic(model),
        'n_params': model.n_parameters,
    }

# Compare information criteria
import pandas as pd
df = pd.DataFrame(results).T
print(df.sort_values('AIC'))

# FZLL justified only if AIC significantly lower (ΔAIC > 10)

Practical Applications

Material Characterization:

FZLL is useful for characterizing extremely complex materials where hierarchical relaxation mechanisms operate:

  1. Polymer blends: Three orders represent each component plus interfacial dynamics

  2. Filled systems: Matrix (\(\alpha\)), filler-matrix interphase (\(\beta\)), filler network (\(\gamma\))

  3. Biological materials: Molecular (fast), cellular (medium), tissue (slow) scales

  4. Colloidal suspensions: Brownian (\(\alpha\)), hydrodynamic (\(\beta\)), structural (\(\gamma\)) relaxation

Quality Control Warning:

Due to 6 parameters, FZLL is NOT recommended for routine QC. Instead:

  • Use for initial material characterization only

  • Switch to simpler model (3-4 parameters) for batch monitoring

  • Focus on derived quantities (e.g., relaxation time distribution) rather than individual parameters

Research Applications:

FZLL is appropriate for fundamental research where:

  • Understanding multi-scale relaxation mechanisms is the goal

  • High-quality data across 5+ decades is available

  • Multiple power-law regimes need quantification

  • Comparison to theoretical predictions requires this flexibility

Example Calculations

Multi-Order Spectrum Analysis:

Given fitted parameters \(c_1 = 500\) Pa·s\(^{\alpha}\), \(c_2 = 100\) Pa·s\(^{\gamma}\), \(\alpha = 0.4\), \(\beta = 0.6\), \(\gamma = 0.8\), \(\tau = 10\) s:

import numpy as np
from rheojax.models import FractionalZenerLiquidLiquid
from rheojax.core.jax_config import safe_import_jax

jax, jnp = safe_import_jax()

model = FractionalZenerLiquidLiquid()
model.parameters.set_value('c1', 500.0)
model.parameters.set_value('c2', 100.0)
model.parameters.set_value('alpha', 0.4)
model.parameters.set_value('beta', 0.6)
model.parameters.set_value('gamma', 0.8)
model.parameters.set_value('tau', 10.0)

# Predict over wide frequency range
omega = jnp.logspace(-4, 3, 200)
G_star = model.predict(omega, test_mode='oscillation')
G_prime = jnp.real(G_star)
G_double_prime = jnp.imag(G_star)

# Identify power-law regimes
log_omega = jnp.log10(omega)
log_Gp = jnp.log10(G_prime)
log_Gpp = jnp.log10(G_double_prime)

# Compute local slopes (discrete derivative)
slope_Gp = jnp.gradient(log_Gp, log_omega)
slope_Gpp = jnp.gradient(log_Gpp, log_omega)

# Find regions with distinct slopes
print("G' power-law slopes by frequency regime:")
for regime, (w_low, w_high) in [('Low', (1e-4, 1e-2)),
                                  ('Mid', (1e-1, 1e1)),
                                  ('High', (1e1, 1e3))]:
    mask = (omega >= w_low) & (omega <= w_high)
    mean_slope = slope_Gp[mask].mean()
    print(f"  {regime} (ω={w_low}-{w_high}): slope ≈ {mean_slope:.2f}")

# Compare to theoretical orders α, β, γ
print(f"Expected orders: α={0.4}, β={0.6}, γ={0.8}")

Hierarchical Fitting Strategy:

# Start simple, add complexity only if justified
from rheojax.models import FractionalMaxwellGel

# Step 1: Fit 3-parameter FMG
model_fmg = FractionalMaxwellGel()
result_fmg = model_fmg.fit(data)
R2_fmg = result_fmg.r_squared
AIC_fmg = compute_aic(result_fmg)

print(f"FMG (3 params): R² = {R2_fmg:.4f}, AIC = {AIC_fmg:.1f}")

# Step 2: Only if R² < 0.95, try 6-parameter FZLL
if R2_fmg < 0.95:
    model_fzll = FractionalZenerLiquidLiquid()

    # Initialize from FMG results
    c1_init = model_fmg.parameters.get_value('c_alpha')
    alpha_init = model_fmg.parameters.get_value('alpha')
    eta_init = model_fmg.parameters.get_value('eta')

    model_fzll.parameters.set_value('c1', c1_init)
    model_fzll.parameters.set_value('alpha', alpha_init)
    model_fzll.parameters.set_value('eta', eta_init)

    result_fzll = model_fzll.fit(data)
    R2_fzll = result_fzll.r_squared
    AIC_fzll = compute_aic(result_fzll)

    print(f"FZLL (6 params): R² = {R2_fzll:.4f}, AIC = {AIC_fzll:.1f}")

    # Justify complexity
    delta_AIC = AIC_fmg - AIC_fzll
    if delta_AIC > 10:
        print(f"FZLL justified: ΔAIC = {delta_AIC:.1f}")
    else:
        print(f"Prefer FMG: ΔAIC = {delta_AIC:.1f} < 10")
else:
    print("FMG adequate, FZLL not needed")

See Also

API References

  • Module: rheojax.models

  • Class: rheojax.models.FractionalZenerLiquidLiquid

Usage

Basic Fitting (Advanced Users Only)

from rheojax.models import FractionalZenerLiquidLiquid
from rheojax.core.data import RheoData
import numpy as np

# CRITICAL: Only use FZLL if simpler models fail
# Requires high-quality data: 5+ decades, 100+ points

# Load experimental data
omega = np.logspace(-4, 3, 150)  # Very wide range
G_star = ...  # Complex modulus

data = RheoData(x=omega, y=G_star, test_mode='oscillation')

# Initialize model
model = FractionalZenerLiquidLiquid()

# Fit with careful initialization
# Recommended: Start from simpler model
from rheojax.models import FractionalMaxwellGel
model_simple = FractionalMaxwellGel()
model_simple.fit(data)

# Use simple model results as initial guess
model.parameters.set_value('c1', model_simple.parameters.get_value('c_alpha'))
model.parameters.set_value('alpha', model_simple.parameters.get_value('alpha'))
model.parameters.set_value('eta', model_simple.parameters.get_value('eta'))
model.parameters.set_value('c2', model_simple.parameters.get_value('c_alpha') * 0.2)
model.parameters.set_value('beta', 0.5)
model.parameters.set_value('gamma', 0.7)

# Fit FZLL
result = model.fit(data)

# Access all 6 parameters
c1 = model.parameters.get_value('c1')
c2 = model.parameters.get_value('c2')
alpha = model.parameters.get_value('alpha')
beta = model.parameters.get_value('beta')
gamma = model.parameters.get_value('gamma')
tau = model.parameters.get_value('tau')

print(f"FZLL Parameters:")
print(f"  c₁ = {c1:.2e}, α = {alpha:.3f} (high-freq branch)")
print(f"  c₂ = {c2:.2e}, γ = {gamma:.3f} (low-freq branch)")
print(f"  β = {beta:.3f}, τ = {tau:.2e} s (crossover)")
print(f"  c₁/c₂ = {c1/c2:.2f}")
print(f"  R² = {result.r_squared:.4f}")

# CRITICAL: Validate against simpler models
R2_simple = model_simple.r_squared
print(f"\nComparison:")
print(f"  FMG (3 params): R² = {R2_simple:.4f}")
print(f"  FZLL (6 params): R² = {result.r_squared:.4f}")

Bayesian Inference (Expert Use Only)

# WARNING: MCMC with 6 parameters requires:
# - Excellent data quality
# - Long sampling (5000+ samples)
# - Multiple chains (4+)
# - Careful convergence checking

# NLSQ warm-start (critical for 6 parameters)
model.fit(data)

# Bayesian inference with conservative settings
result = model.fit_bayesian(
    data,
    num_warmup=2000,  # Longer warmup for 6 params
    num_samples=5000,  # More samples needed
    num_chains=4,
    seed=42
)

# Check convergence CAREFULLY
import arviz as az
inference_data = az.from_numpyro(result)
summary = az.summary(inference_data, hdi_prob=0.95)
print(summary)

# Flag convergence issues
r_hat_max = summary['r_hat'].max()
ess_min = summary['ess_bulk'].min()

print(f"\nConvergence Diagnostics:")
print(f"  Max R-hat: {r_hat_max:.3f} (want < 1.01)")
print(f"  Min ESS: {ess_min:.0f} (want > 400)")

if r_hat_max > 1.01 or ess_min < 400:
    print("  WARNING: Convergence issues detected!")
    print("  - Increase num_samples and num_warmup")
    print("  - Check parameter correlations")
    print("  - Consider simpler model")

# Visualize 6D posterior (challenging!)
az.plot_pair(
    inference_data,
    var_names=['c1', 'c2', 'alpha', 'beta', 'gamma', 'tau'],
    kind='kde',
    figsize=(15, 15)
)

Model Comparison Workflow

# REQUIRED: Always compare to simpler models
from rheojax.models import (
    FractionalMaxwellGel,
    FractionalMaxwellLiquid,
    FractionalZenerSolidSolid,
    FractionalZenerLiquidLiquid
)

models = {
    'FMG (3p)': FractionalMaxwellGel(),
    'FML (4p)': FractionalMaxwellLiquid(),
    'FZSS (4p)': FractionalZenerSolidSolid(),
    'FZLL (6p)': FractionalZenerLiquidLiquid(),
}

results = {}
for name, model in models.items():
    try:
        model.fit(data)
        n_params = len(model.parameters)
        n_data = len(data.x)

        # Compute information criteria
        residuals = data.y - model.predict(data.x, test_mode=data.test_mode)
        SSE = np.sum(np.abs(residuals)**2)
        AIC = n_data * np.log(SSE/n_data) + 2*n_params
        BIC = n_data * np.log(SSE/n_data) + n_params*np.log(n_data)

        results[name] = {
            'R²': model.r_squared if hasattr(model, 'r_squared') else 0,
            'AIC': AIC,
            'BIC': BIC,
            'Params': n_params,
        }
    except Exception as e:
        print(f"{name} failed: {e}")

# Display comparison
import pandas as pd
df = pd.DataFrame(results).T
df['ΔAIC'] = df['AIC'] - df['AIC'].min()
df['ΔBIC'] = df['BIC'] - df['BIC'].min()
print(df.sort_values('AIC'))

# Decision rule
best_model = df['AIC'].idxmin()
delta_aic = df.loc['FZLL (6p)', 'ΔAIC'] if 'FZLL (6p)' in df.index else np.inf

print(f"\nRecommendation:")
if best_model == 'FZLL (6p)' and delta_aic < -10:
    print("  FZLL justified (ΔAIC < -10)")
else:
    print(f"  Use {best_model} instead")
    print(f"  FZLL adds complexity without sufficient improvement")

Advanced Visualization

# Visualize multi-order behavior
import matplotlib.pyplot as plt

omega = np.logspace(-4, 3, 200)
G_star = model.predict(omega, test_mode='oscillation')
G_prime = np.real(G_star)
G_double_prime = np.imag(G_star)

fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# Storage modulus
axes[0, 0].loglog(omega, G_prime, 'o-')
axes[0, 0].set_xlabel('ω (rad/s)')
axes[0, 0].set_ylabel("G' (Pa)")
axes[0, 0].set_title('Storage Modulus')
axes[0, 0].grid(True)

# Loss modulus
axes[0, 1].loglog(omega, G_double_prime, 's-')
axes[0, 1].set_xlabel('ω (rad/s)')
axes[0, 1].set_ylabel("G'' (Pa)")
axes[0, 1].set_title('Loss Modulus')
axes[0, 1].grid(True)

# Loss tangent
tan_delta = G_double_prime / G_prime
axes[1, 0].semilogx(omega, tan_delta, '^-')
axes[1, 0].set_xlabel('ω (rad/s)')
axes[1, 0].set_ylabel('tan(δ)')
axes[1, 0].set_title('Loss Tangent')
axes[1, 0].grid(True)

# Local slopes (power-law analysis)
log_omega = np.log10(omega)
log_Gp = np.log10(G_prime)
slope = np.gradient(log_Gp, log_omega)
axes[1, 1].semilogx(omega, slope, 'd-')
axes[1, 1].axhline(alpha, ls='--', label=f'α={alpha:.2f}')
axes[1, 1].axhline(beta, ls='--', label=f'β={beta:.2f}')
axes[1, 1].axhline(gamma, ls='--', label=f'γ={gamma:.2f}')
axes[1, 1].set_xlabel('ω (rad/s)')
axes[1, 1].set_ylabel("d(log G')/d(log ω)")
axes[1, 1].set_title('Local Power-Law Exponent')
axes[1, 1].legend()
axes[1, 1].grid(True)

plt.tight_layout()

See also

References