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):
Time domain (relaxation modulus; general case):
Special cases (e.g., \(\beta=\alpha\), \(c_2=0\)) reduce to two-parameter Mittag-Leffler forms.
Parameters¶
Name |
Symbol |
Units |
Bounds |
Notes |
|---|---|---|---|---|
|
\(c_1\) |
Pa·sα |
[1e-3, 1e9] |
First SpringPot constant |
|
\(c_2\) |
Pa·sγ |
[1e-3, 1e9] |
Second SpringPot constant |
|
\(\alpha\) |
dimensionless |
[0, 1] |
First fractional order |
|
\(\beta\) |
dimensionless |
[0, 1] |
Second fractional order |
|
\(\gamma\) |
dimensionless |
[0, 1] |
Third fractional order |
|
\(\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:
Simpler models fail: If 3-4 parameter fractional models (FMG, FML, FZSS) show systematic deviations
Multiple distinct power-law regimes: Data shows different slopes \(\alpha, \beta, \gamma\) in separate frequency decades
Complex fluids: Polymer blends, filled systems, colloidal suspensions, or hierarchical structures
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¶
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 |
\(\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:
Frequency sweep (SAOS): 5+ decades to resolve multiple power-law regimes
High data quality: 100+ points, minimal noise (6 parameters require excellent data)
Test amplitude: Within LVR (< 5% strain)
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:
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:
Data quality: 5+ decades in frequency, >100 points, SNR > 20 dB
Simpler models fail: FMG/FML show systematic deviations (\(R^2\) < 0.95)
Multiple power-law regimes: Clearly distinct slopes \(\alpha, \beta, \gamma\) in log-log plot
Statistical justification: \(\Delta\text{AIC}\) > 10 compared to best 4-parameter model
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:
Polymer blends: Three orders represent each component plus interfacial dynamics
Filled systems: Matrix (\(\alpha\)), filler-matrix interphase (\(\beta\)), filler network (\(\gamma\))
Biological materials: Molecular (fast), cellular (medium), tissue (slow) scales
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¶
Fractional Zener Solid-Liquid (Fractional) and Fractional Zener Solid-Solid (Fractional) — related variants with solid plateaus
Generalized Fractional Maxwell (Two-Order) — recoverable when one SpringPot order is suppressed
Carreau Model — pair liquid-like viscoelastic spectra with steady-flow fits
OWChirp — fast acquisition of broadband \(G^*\) for Zener fitting
../../examples/advanced/04-fractional-models-deep-dive — worked comparisons of all fractional Zener forms
API References¶
Module:
rheojax.modelsClass:
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¶
Fractional Zener Solid-Liquid (Fractional) and Fractional Zener Solid-Solid (Fractional) — related variants with solid plateaus.
Generalized Fractional Maxwell (Two-Order) — recoverable when one SpringPot order is suppressed.
Carreau Model — pair liquid-like viscoelastic spectra with steady-flow fits.
OWChirp — fast acquisition of broadband \(G^*\) for Zener fitting.
../../examples/advanced/04-fractional-models-deep-dive — worked comparisons of all fractional Zener forms.