有没有办法为p1,p2,p3和p4分配以下等式的随机值?
p1 y1 + p2 y2 + p3 y3 = p4
假设y1,y2和y3是要求解的变量。
答案 0 :(得分:9)
最简单的(?)方法是Thread
替换规则上的随机值列表:
例如:
p1 y1 + p2 y2 + p3 y3 == p4 /. Thread[{p1, p2, p3, p4} -> RandomReal[{0, 1}, 4]]
(* 0.345963 y1 + 0.333069 y2 + 0.565556 y3 == 0.643419 *)
或者,在Leonid的启发下,您可以使用Alternatives
和模式匹配:
p1 y1 + p2 y2 + p3 y3 == p4 /. p1 | p2 | p3 | p4 :> RandomReal[]
只是为了好玩,这是另一个类似的解决方案:
p1 y1 + p2 y2 + p3 y3 == p4 /. s_Symbol :>
RandomReal[]/;StringMatchQ[SymbolName[s], "p"~~DigitCharacter]
如果您希望DigitCharacter
与NumberString
不匹配,则可以将p0, p1, ..., p9
替换为{{1}}。当然,对于大型表达式,上述内容不会特别有效......
答案 1 :(得分:7)
其他答案都很好,但如果您做了很多这类事情,我建议您以更系统的方式命名变量和系数。这不仅可以让您编写更简单的规则,还可以在从3个等式变为4时进行更简单的更改。例如:
In[1]:= vars = Array[y, 3]
Out[1]= {y[1], y[2], y[3]}
In[2]:= coeffs = Array[p, 4]
Out[2]= {p[1], p[2], p[3], p[4]}
制作等式时,你可能会有点幻想:
In[3]:= vars . Most[coeffs] == Last[coeffs]
Out[3]= p[1] y[1] + p[2] y[2] + p[3] y[3] == p[4]
将随机数替换为系数现在是一个非常基本的规则:
In[4]:= sub = eqn /. p[_] :> RandomReal[]
Out[4]= 0.281517 y[1] + 0.089162 y[2] + 0.0860836 y[3] == 0.915208
如果您愿意,最后的规则也可以写成_p :> RandomReal[]
。您也不必键入太多来解决它。
In[5]:= Reduce[sub]
Out[5]= y[1] == 3.25099 - 0.31672 y[2] - 0.305785 y[3]
正如Andrew Walker所述,您使用Reduce
来查找所有解决方案,而不只是其中的一部分。你可以将它包装在一个函数中,该函数对变量的数量进行参数化,如下所示:
In[6]:= reduceRandomEquation[n_Integer] :=
With[{vars = Array[y, n], coeffs = Array[p, n+1]},
Reduce[vars . Most[coeffs]]
In[7]:= reduceRandomEquation[4]
Out[7]= y[1] == 2.13547 - 0.532422 y[2] - 0.124029 y[3] - 2.48944 y[4]
答案 2 :(得分:4)
如果您需要替换值的解决方案,可以采用以下方法:
f[y1_, y2_, y3_] := p1 y1 + p2 y2 + p3 y3 - p4
g = f[y1, y2, y3] /. p1 -> RandomReal[] /. p2 -> RandomReal[] /.
p3 -> RandomReal[] /. p4 -> RandomReal[]
Reduce[g == 0, {y1}]
Reduce[g == 0, {y2}]
Reduce[g == 0, {y3}]
如果你需要的只是方程式的解决方案:
f[y1_, y2_, y3_] := p1 y1 + p2 y2 + p3 y3 - p4
g = f[y1, y2, y3]
Solve[g == 0, {y1}]
Solve[g == 0, {y2}]
Solve[g == 0, {y3}]
答案 3 :(得分:3)
如果你可以没有符号系数名称p1等,那么你可能会生成如下。我们得到一个变量列表,方程数,以及系数和rhs向量的范围。
In[80]:= randomLinearEquations[vars_, n_, crange_] :=
Thread[RandomReal[crange, {n, Length[vars]}].vars ==
RandomReal[crange, n]]
In[81]:= randomLinearEquations[{x, y, z}, 2, {-10, 10}]
Out[81]= {7.72377 x - 4.18397 y - 4.58168 z == -7.78991, -1.13697 x +
5.67126 y + 7.47534 z == -6.11561}
直接获得变量,如整数系数,矩阵和rhs的不同范围等。
Daniel Lichtblau
答案 4 :(得分:2)
另一种方式:
dim = 3;
eq = Array[p, dim].Array[y, dim] == p[dim + 1];
Evaluate@Array[p, dim + 1] = RandomInteger[10, dim + 1]
Solve[eq, Array[y, dim]]