[英]Pyomo: Getting error for solving DAE. (KeyError: 2447832121968)
I am trying to solve DAE using pyomo.我正在尝试使用 pyomo 解决 DAE。 However, I am getting Keyerrors.The material balance equation in chemical engineering, which includes differential equations.
但是,我得到了 Keyerrors。化学工程中的材料平衡方程,其中包括微分方程。
import pyomo.environ as pyo
from pyomo import dae
from pyomo import opt
import numpy as np
gasname = ['Gas1', 'Gas2']
x_init_gas1 = 0.2
x_init_gas2 = 0.8
x_init_list = [x_init_gas1, x_init_gas2]
q_list = [1.2e-6, 5.0e-5]
x_init_dict = dict(zip(gasname, x_init_list))
q_dict = dict(zip(gasname, q_list))
area1_start = 0
area1_end = 100
ph_1, pl_1 = [3, 1]
U = 20
model = pyo.ConcreteModel(name='membrane sepalation')
model.gas_name = pyo.Set(initialize=gasname)
model.area1 = dae.ContinuousSet(bounds=(area1_start, area1_end))
discretizer_area1 = pyo.TransformationFactory('dae.finite_difference')
discretizer_area1.apply(model, wrt=model.area1)
area1_delta = list(model.area1)
model.area1_len = pyo.Set(initialize=range(0, len(area1_delta)))
model.ode_F1 = pyo.Var(model.gas_name, model.area1, domain=pyo.PositiveReals, initialize=(10))
model.F1_x = pyo.Var(model.gas_name, bounds=(0, 30), initialize=(10))
model.V1_x = pyo.Var(model.gas_name, bounds=(0, 30), initialize=(10))
model.G1_x = pyo.Var(model.gas_name, bounds=(0, 30), initialize=(10))
model.F1 = sum(model.F1_x[s] for s in gasname)
model.V1 = sum(model.V1_x[s] for s in gasname)
model.G1 = sum(model.G1_x[s] for s in gasname)
ph_1, pl_1 = [2.98, 1]
# 1
def const_F1_x(m, gas):
return m.F1_x[gas] == x_init_dict[gas]*U
model.const_F1_x = pyo.Constraint(model.gas_name, rule=const_F1_x)
def const_F1_flow(m, gas):
return m.F1_x[gas] == m.V1_x[gas] + m.G1_x[gas]
model.const_F1_flow = pyo.Constraint(model.gas_name, rule=const_F1_flow)
def const_module1_flow(m):
return m.F1 == m.V1 + m.G1
model.const_module1_flow = pyo.Constraint(rule=const_module1_flow)
model.dF1_da = dae.DerivativeVar(model.ode_F1, wrt=model.area1, domain=pyo.PositiveReals)
def _ode_rule_module1(m, a, gas):
if a == 0:
return pyo.Constraint.Skip
i = area1_delta.index(a)
return m.dF1_da[gas, a] == -q_dict[gas]*((ph_1*m.ode_F1[gas, a]/sum(m.ode_F1[:, a]))-pl_1*((m.ode_F1[gas, a] - m.ode_F1[gas, area1_delta[i-1]])/(sum(m.ode_F1[:, a])-sum(m.ode_F1[:, area1_delta[i-1]])+1e-10)))
model.ode_rule_module1 = pyo.Constraint(model.area1, model.gas_name, rule=_ode_rule_module1)
def _ode_rule_module1_entry(m, gas):
return m.F1_x[gas] == m.ode_F1[gas, area1_start]
model.ode_rule_module1_entry = pyo.Constraint(model.gas_name, rule=_ode_rule_module1_entry)
def _ode_rule_module1_exit(m, gas):
return m.V1_x[gas] == m.ode_F1[gas, area1_end]
model.ode_rule_module1_exit = pyo.Constraint(model.gas_name, rule=_ode_rule_module1_exit)
def calc_objective(m):
return m.V1_x[gasname[0]] / (U*x_init_gas1)
model.OBJ = pyo.Objective(rule=calc_objective, sense=pyo.maximize)
solver = opt.SolverFactory('ipopt')
solver.options["print_level"] = 1
res = solver.solve(model, tee=True)
print(model.display())
and, the error I got was而且,我得到的错误是
File ~.py:154 in <module>
res = solver.solve(model, tee=True)
File ~\anaconda3\lib\site-packages\pyomo\opt\base\solvers.py:570 in solve
self._presolve(*args, **kwds)
~~~
File pyomo\repn\plugins\ampl\ampl_.pyx:1039 in pyomo.repn.plugins.ampl.ampl_.ProblemWriter_nl._print_model_NL
File pyomo\repn\plugins\ampl\ampl_.pyx:1033 in genexpr
File pyomo\repn\plugins\ampl\ampl_.pyx:1033 in genexpr
KeyError: 2447832121968
The model.display() showed like that. model.display() 就是这样显示的。
4 Set Declarations
area1_len : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 11 : {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
gas_name : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 2 : {'Gas1', 'Gas2'}
ode_F1_index : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : gas_name*area1 : 22 : {('Gas1', 0), ('Gas1', 10.0), ('Gas1', 20.0), ('Gas1', 30.0), ('Gas1', 40.0), ('Gas1', 50.0), ('Gas1', 60.0), ('Gas1', 70.0), ('Gas1', 80.0), ('Gas1', 90.0), ('Gas1', 100), ('Gas2', 0), ('Gas2', 10.0), ('Gas2', 20.0), ('Gas2', 30.0), ('Gas2', 40.0), ('Gas2', 50.0), ('Gas2', 60.0), ('Gas2', 70.0), ('Gas2', 80.0), ('Gas2', 90.0), ('Gas2', 100)}
ode_rule_module1_index : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : area1*gas_name : 22 : {(0, 'Gas1'), (0, 'Gas2'), (10.0, 'Gas1'), (10.0, 'Gas2'), (20.0, 'Gas1'), (20.0, 'Gas2'), (30.0, 'Gas1'), (30.0, 'Gas2'), (40.0, 'Gas1'), (40.0, 'Gas2'), (50.0, 'Gas1'), (50.0, 'Gas2'), (60.0, 'Gas1'), (60.0, 'Gas2'), (70.0, 'Gas1'), (70.0, 'Gas2'), (80.0, 'Gas1'), (80.0, 'Gas2'), (90.0, 'Gas1'), (90.0, 'Gas2'), (100, 'Gas1'), (100, 'Gas2')}
1 RangeSet Declarations
area1_domain : Dimen=1, Size=Inf, Bounds=(0, 100)
Key : Finite : Members
None : False : [0..100]
4 Var Declarations
F1_x : Size=2, Index=gas_name
Key : Lower : Value : Upper : Fixed : Stale : Domain
Gas1 : 0 : 10 : 30 : False : False : Reals
Gas2 : 0 : 10 : 30 : False : False : Reals
G1_x : Size=2, Index=gas_name
Key : Lower : Value : Upper : Fixed : Stale : Domain
Gas1 : 0 : 10 : 30 : False : False : Reals
Gas2 : 0 : 10 : 30 : False : False : Reals
V1_x : Size=2, Index=gas_name
Key : Lower : Value : Upper : Fixed : Stale : Domain
Gas1 : 0 : 10 : 30 : False : False : Reals
Gas2 : 0 : 10 : 30 : False : False : Reals
ode_F1 : Size=22, Index=ode_F1_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
('Gas1', 0) : 0 : 10 : None : False : False : PositiveReals
('Gas1', 10.0) : 0 : 10 : None : False : False : PositiveReals
('Gas1', 20.0) : 0 : 10 : None : False : False : PositiveReals
('Gas1', 30.0) : 0 : 10 : None : False : False : PositiveReals
('Gas1', 40.0) : 0 : 10 : None : False : False : PositiveReals
('Gas1', 50.0) : 0 : 10 : None : False : False : PositiveReals
('Gas1', 60.0) : 0 : 10 : None : False : False : PositiveReals
('Gas1', 70.0) : 0 : 10 : None : False : False : PositiveReals
('Gas1', 80.0) : 0 : 10 : None : False : False : PositiveReals
('Gas1', 90.0) : 0 : 10 : None : False : False : PositiveReals
('Gas1', 100) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 0) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 10.0) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 20.0) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 30.0) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 40.0) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 50.0) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 60.0) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 70.0) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 80.0) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 90.0) : 0 : 10 : None : False : False : PositiveReals
('Gas2', 100) : 0 : 10 : None : False : False : PositiveReals
1 Objective Declarations
OBJ : Size=1, Index=None, Active=True
Key : Active : Sense : Expression
None : True : maximize : 0.2557544757033248*V1_x[Gas1]
6 Constraint Declarations
const_F1_flow : Size=2, Index=gas_name, Active=True
Key : Lower : Body : Upper : Active
Gas1 : 0.0 : F1_x[Gas1] - (V1_x[Gas1] + G1_x[Gas1]) : 0.0 : True
Gas2 : 0.0 : F1_x[Gas2] - (V1_x[Gas2] + G1_x[Gas2]) : 0.0 : True
const_F1_x : Size=2, Index=gas_name, Active=True
Key : Lower : Body : Upper : Active
Gas1 : 3.91 : F1_x[Gas1] : 3.91 : True
Gas2 : 15.64 : F1_x[Gas2] : 15.64 : True
const_module1_flow : Size=1, Index=None, Active=True
Key : Lower : Body : Upper : Active
None : 0.0 : F1_x[Gas1] + F1_x[Gas2] - (V1_x[Gas1] + V1_x[Gas2] + G1_x[Gas1] + G1_x[Gas2]) : 0.0 : True
ode_rule_module1 : Size=20, Index=ode_rule_module1_index, Active=True
Key : Lower : Body : Upper : Active
(10.0, 'Gas1') : 0.0 : dF1_da[Gas1,10.0] + 1.2e-06*(2.98*ode_F1[Gas1,10.0]/(ode_F1[Gas1,10.0] + ode_F1[Gas2,10.0]) - (ode_F1[Gas1,10.0] - ode_F1[Gas1,0])/(ode_F1[Gas1,10.0] + ode_F1[Gas2,10.0] - (ode_F1[Gas1,0] + ode_F1[Gas2,0]) + 1e-10)) : 0.0 : True
(10.0, 'Gas2') : 0.0 : dF1_da[Gas2,10.0] + 5e-05*(2.98*ode_F1[Gas2,10.0]/(ode_F1[Gas1,10.0] + ode_F1[Gas2,10.0]) - (ode_F1[Gas2,10.0] - ode_F1[Gas2,0])/(ode_F1[Gas1,10.0] + ode_F1[Gas2,10.0] - (ode_F1[Gas1,0] + ode_F1[Gas2,0]) + 1e-10)) : 0.0 : True
(20.0, 'Gas1') : 0.0 : dF1_da[Gas1,20.0] + 1.2e-06*(2.98*ode_F1[Gas1,20.0]/(ode_F1[Gas1,20.0] + ode_F1[Gas2,20.0]) - (ode_F1[Gas1,20.0] - ode_F1[Gas1,10.0])/(ode_F1[Gas1,20.0] + ode_F1[Gas2,20.0] - (ode_F1[Gas1,10.0] + ode_F1[Gas2,10.0]) + 1e-10)) : 0.0 : True
(20.0, 'Gas2') : 0.0 : dF1_da[Gas2,20.0] + 5e-05*(2.98*ode_F1[Gas2,20.0]/(ode_F1[Gas1,20.0] + ode_F1[Gas2,20.0]) - (ode_F1[Gas2,20.0] - ode_F1[Gas2,10.0])/(ode_F1[Gas1,20.0] + ode_F1[Gas2,20.0] - (ode_F1[Gas1,10.0] + ode_F1[Gas2,10.0]) + 1e-10)) : 0.0 : True
(30.0, 'Gas1') : 0.0 : dF1_da[Gas1,30.0] + 1.2e-06*(2.98*ode_F1[Gas1,30.0]/(ode_F1[Gas1,30.0] + ode_F1[Gas2,30.0]) - (ode_F1[Gas1,30.0] - ode_F1[Gas1,20.0])/(ode_F1[Gas1,30.0] + ode_F1[Gas2,30.0] - (ode_F1[Gas1,20.0] + ode_F1[Gas2,20.0]) + 1e-10)) : 0.0 : True
(30.0, 'Gas2') : 0.0 : dF1_da[Gas2,30.0] + 5e-05*(2.98*ode_F1[Gas2,30.0]/(ode_F1[Gas1,30.0] + ode_F1[Gas2,30.0]) - (ode_F1[Gas2,30.0] - ode_F1[Gas2,20.0])/(ode_F1[Gas1,30.0] + ode_F1[Gas2,30.0] - (ode_F1[Gas1,20.0] + ode_F1[Gas2,20.0]) + 1e-10)) : 0.0 : True
(40.0, 'Gas1') : 0.0 : dF1_da[Gas1,40.0] + 1.2e-06*(2.98*ode_F1[Gas1,40.0]/(ode_F1[Gas1,40.0] + ode_F1[Gas2,40.0]) - (ode_F1[Gas1,40.0] - ode_F1[Gas1,30.0])/(ode_F1[Gas1,40.0] + ode_F1[Gas2,40.0] - (ode_F1[Gas1,30.0] + ode_F1[Gas2,30.0]) + 1e-10)) : 0.0 : True
(40.0, 'Gas2') : 0.0 : dF1_da[Gas2,40.0] + 5e-05*(2.98*ode_F1[Gas2,40.0]/(ode_F1[Gas1,40.0] + ode_F1[Gas2,40.0]) - (ode_F1[Gas2,40.0] - ode_F1[Gas2,30.0])/(ode_F1[Gas1,40.0] + ode_F1[Gas2,40.0] - (ode_F1[Gas1,30.0] + ode_F1[Gas2,30.0]) + 1e-10)) : 0.0 : True
(50.0, 'Gas1') : 0.0 : dF1_da[Gas1,50.0] + 1.2e-06*(2.98*ode_F1[Gas1,50.0]/(ode_F1[Gas1,50.0] + ode_F1[Gas2,50.0]) - (ode_F1[Gas1,50.0] - ode_F1[Gas1,40.0])/(ode_F1[Gas1,50.0] + ode_F1[Gas2,50.0] - (ode_F1[Gas1,40.0] + ode_F1[Gas2,40.0]) + 1e-10)) : 0.0 : True
(50.0, 'Gas2') : 0.0 : dF1_da[Gas2,50.0] + 5e-05*(2.98*ode_F1[Gas2,50.0]/(ode_F1[Gas1,50.0] + ode_F1[Gas2,50.0]) - (ode_F1[Gas2,50.0] - ode_F1[Gas2,40.0])/(ode_F1[Gas1,50.0] + ode_F1[Gas2,50.0] - (ode_F1[Gas1,40.0] + ode_F1[Gas2,40.0]) + 1e-10)) : 0.0 : True
(60.0, 'Gas1') : 0.0 : dF1_da[Gas1,60.0] + 1.2e-06*(2.98*ode_F1[Gas1,60.0]/(ode_F1[Gas1,60.0] + ode_F1[Gas2,60.0]) - (ode_F1[Gas1,60.0] - ode_F1[Gas1,50.0])/(ode_F1[Gas1,60.0] + ode_F1[Gas2,60.0] - (ode_F1[Gas1,50.0] + ode_F1[Gas2,50.0]) + 1e-10)) : 0.0 : True
(60.0, 'Gas2') : 0.0 : dF1_da[Gas2,60.0] + 5e-05*(2.98*ode_F1[Gas2,60.0]/(ode_F1[Gas1,60.0] + ode_F1[Gas2,60.0]) - (ode_F1[Gas2,60.0] - ode_F1[Gas2,50.0])/(ode_F1[Gas1,60.0] + ode_F1[Gas2,60.0] - (ode_F1[Gas1,50.0] + ode_F1[Gas2,50.0]) + 1e-10)) : 0.0 : True
(70.0, 'Gas1') : 0.0 : dF1_da[Gas1,70.0] + 1.2e-06*(2.98*ode_F1[Gas1,70.0]/(ode_F1[Gas1,70.0] + ode_F1[Gas2,70.0]) - (ode_F1[Gas1,70.0] - ode_F1[Gas1,60.0])/(ode_F1[Gas1,70.0] + ode_F1[Gas2,70.0] - (ode_F1[Gas1,60.0] + ode_F1[Gas2,60.0]) + 1e-10)) : 0.0 : True
(70.0, 'Gas2') : 0.0 : dF1_da[Gas2,70.0] + 5e-05*(2.98*ode_F1[Gas2,70.0]/(ode_F1[Gas1,70.0] + ode_F1[Gas2,70.0]) - (ode_F1[Gas2,70.0] - ode_F1[Gas2,60.0])/(ode_F1[Gas1,70.0] + ode_F1[Gas2,70.0] - (ode_F1[Gas1,60.0] + ode_F1[Gas2,60.0]) + 1e-10)) : 0.0 : True
(80.0, 'Gas1') : 0.0 : dF1_da[Gas1,80.0] + 1.2e-06*(2.98*ode_F1[Gas1,80.0]/(ode_F1[Gas1,80.0] + ode_F1[Gas2,80.0]) - (ode_F1[Gas1,80.0] - ode_F1[Gas1,70.0])/(ode_F1[Gas1,80.0] + ode_F1[Gas2,80.0] - (ode_F1[Gas1,70.0] + ode_F1[Gas2,70.0]) + 1e-10)) : 0.0 : True
(80.0, 'Gas2') : 0.0 : dF1_da[Gas2,80.0] + 5e-05*(2.98*ode_F1[Gas2,80.0]/(ode_F1[Gas1,80.0] + ode_F1[Gas2,80.0]) - (ode_F1[Gas2,80.0] - ode_F1[Gas2,70.0])/(ode_F1[Gas1,80.0] + ode_F1[Gas2,80.0] - (ode_F1[Gas1,70.0] + ode_F1[Gas2,70.0]) + 1e-10)) : 0.0 : True
(90.0, 'Gas1') : 0.0 : dF1_da[Gas1,90.0] + 1.2e-06*(2.98*ode_F1[Gas1,90.0]/(ode_F1[Gas1,90.0] + ode_F1[Gas2,90.0]) - (ode_F1[Gas1,90.0] - ode_F1[Gas1,80.0])/(ode_F1[Gas1,90.0] + ode_F1[Gas2,90.0] - (ode_F1[Gas1,80.0] + ode_F1[Gas2,80.0]) + 1e-10)) : 0.0 : True
(90.0, 'Gas2') : 0.0 : dF1_da[Gas2,90.0] + 5e-05*(2.98*ode_F1[Gas2,90.0]/(ode_F1[Gas1,90.0] + ode_F1[Gas2,90.0]) - (ode_F1[Gas2,90.0] - ode_F1[Gas2,80.0])/(ode_F1[Gas1,90.0] + ode_F1[Gas2,90.0] - (ode_F1[Gas1,80.0] + ode_F1[Gas2,80.0]) + 1e-10)) : 0.0 : True
(100, 'Gas1') : 0.0 : dF1_da[Gas1,100] + 1.2e-06*(2.98*ode_F1[Gas1,100]/(ode_F1[Gas1,100] + ode_F1[Gas2,100]) - (ode_F1[Gas1,100] - ode_F1[Gas1,90.0])/(ode_F1[Gas1,100] + ode_F1[Gas2,100] - (ode_F1[Gas1,90.0] + ode_F1[Gas2,90.0]) + 1e-10)) : 0.0 : True
(100, 'Gas2') : 0.0 : dF1_da[Gas2,100] + 5e-05*(2.98*ode_F1[Gas2,100]/(ode_F1[Gas1,100] + ode_F1[Gas2,100]) - (ode_F1[Gas2,100] - ode_F1[Gas2,90.0])/(ode_F1[Gas1,100] + ode_F1[Gas2,100] - (ode_F1[Gas1,90.0] + ode_F1[Gas2,90.0]) + 1e-10)) : 0.0 : True
ode_rule_module1_entry : Size=2, Index=gas_name, Active=True
Key : Lower : Body : Upper : Active
Gas1 : 0.0 : F1_x[Gas1] - ode_F1[Gas1,0] : 0.0 : True
Gas2 : 0.0 : F1_x[Gas2] - ode_F1[Gas2,0] : 0.0 : True
ode_rule_module1_exit : Size=2, Index=gas_name, Active=True
Key : Lower : Body : Upper : Active
Gas1 : 0.0 : V1_x[Gas1] - ode_F1[Gas1,100] : 0.0 : True
Gas2 : 0.0 : V1_x[Gas2] - ode_F1[Gas2,100] : 0.0 : True
1 ContinuousSet Declarations
area1 : Size=1, Index=None, Ordered=Sorted
Key : Dimen : Domain : Size : Members
None : 1 : [0..100] : 11 : {0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100}
1 DerivativeVar Declarations
dF1_da : Size=22, Index=ode_F1_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
('Gas1', 0) : 0 : None : None : False : True : PositiveReals
('Gas1', 10.0) : 0 : None : None : False : True : PositiveReals
('Gas1', 20.0) : 0 : None : None : False : True : PositiveReals
('Gas1', 30.0) : 0 : None : None : False : True : PositiveReals
('Gas1', 40.0) : 0 : None : None : False : True : PositiveReals
('Gas1', 50.0) : 0 : None : None : False : True : PositiveReals
('Gas1', 60.0) : 0 : None : None : False : True : PositiveReals
('Gas1', 70.0) : 0 : None : None : False : True : PositiveReals
('Gas1', 80.0) : 0 : None : None : False : True : PositiveReals
('Gas1', 90.0) : 0 : None : None : False : True : PositiveReals
('Gas1', 100) : 0 : None : None : False : True : PositiveReals
('Gas2', 0) : 0 : None : None : False : True : PositiveReals
('Gas2', 10.0) : 0 : None : None : False : True : PositiveReals
('Gas2', 20.0) : 0 : None : None : False : True : PositiveReals
('Gas2', 30.0) : 0 : None : None : False : True : PositiveReals
('Gas2', 40.0) : 0 : None : None : False : True : PositiveReals
('Gas2', 50.0) : 0 : None : None : False : True : PositiveReals
('Gas2', 60.0) : 0 : None : None : False : True : PositiveReals
('Gas2', 70.0) : 0 : None : None : False : True : PositiveReals
('Gas2', 80.0) : 0 : None : None : False : True : PositiveReals
('Gas2', 90.0) : 0 : None : None : False : True : PositiveReals
('Gas2', 100) : 0 : None : None : False : True : PositiveReals
18 Declarations: gas_name area1_domain area1 area1_len ode_F1_index ode_F1 F1_x V1_x G1_x const_F1_x const_F1_flow const_module1_flow dF1_da ode_rule_module1_index ode_rule_module1 ode_rule_module1_entry ode_rule_module1_exit OBJ
Similar questions existed before, but I could not understand them.以前也有类似的问题,但我无法理解。
Could you please help me solve it?你能帮我解决吗? Thank you very much!
非常感谢!
You're applying the discretization transformation before declaring all the DerivativeVar
components in your model.在声明模型中的所有
DerivativeVar
组件之前,您正在应用离散化转换。 The discretization transformation discretizes the ContinuousSets
in the model and also adds discretization equations to the model for every DerivativeVar
that has been declared so it is crucial that the transformation not be applied until after all DerivativeVar
components have been declared.离散化变换将模型中的
ContinuousSets
离散化,并为每个已声明的DerivativeVar
添加离散方程到模型中,因此在声明所有DerivativeVar
组件之前不要应用变换是至关重要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.