在mathematica中创建线性方程的随机系数

pen*_*nny 5 random wolfram-mathematica

有没有办法为p1,p2,p3和p4分配一个随机值用于下面的等式?

p1 y1 + p2 y2 + p3 y3 = p4

假设y1,y2和y3是要求解的变量.

Sim*_*mon 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 *)
Run Code Online (Sandbox Code Playgroud)

或者,受Leonid的启发,您可以使用Alternatives和模式匹配:

p1 y1 + p2 y2 + p3 y3 == p4 /. p1 | p2 | p3 | p4 :> RandomReal[]
Run Code Online (Sandbox Code Playgroud)

只是为了好玩,这里还有一个类似的解决方案:

p1 y1 + p2 y2 + p3 y3 == p4 /. s_Symbol :> 
     RandomReal[]/;StringMatchQ[SymbolName[s], "p"~~DigitCharacter]
Run Code Online (Sandbox Code Playgroud)

你可以替换的地方DigitCharacter,NumberString如果你想要它不仅仅是匹配p0, p1, ..., p9.当然,对于大型表达式,上述内容不会特别有效......


Pil*_*lsy 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]}
Run Code Online (Sandbox Code Playgroud)

当你制定方程时,你可能会有点幻想:

In[3]:= vars . Most[coeffs] == Last[coeffs]
Out[3]= p[1] y[1] + p[2] y[2] + p[3] y[3] == p[4]
Run Code Online (Sandbox Code Playgroud)

将随机数替换为系数现在是一个非常基本的规则:

In[4]:= sub = eqn /. p[_] :> RandomReal[] 
Out[4]= 0.281517 y[1] + 0.089162 y[2] + 0.0860836 y[3] == 0.915208
Run Code Online (Sandbox Code Playgroud)

_p :> RandomReal[]如果您愿意,最后的规则也可以写成.您也不必键入太多来解决它.

In[5]:= Reduce[sub]
Out[5]= y[1] == 3.25099 - 0.31672 y[2] - 0.305785 y[3]
Run Code Online (Sandbox Code Playgroud)

正如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]
Run Code Online (Sandbox Code Playgroud)


And*_*ker 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}]
Run Code Online (Sandbox Code Playgroud)

如果您需要的只是方程的解:

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}]
Run Code Online (Sandbox Code Playgroud)

  • @安德鲁+1。您的解决方案可以稍微简化:`f[y1, y2, y3] /。p1 | p2| p3 | p4 :> RandomReal[]`。 (3认同)