Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 在mathematica中为线性方程组创建随机系数_Random_Wolfram Mathematica - Fatal编程技术网

Random 在mathematica中为线性方程组创建随机系数

Random 在mathematica中为线性方程组创建随机系数,random,wolfram-mathematica,Random,Wolfram Mathematica,有没有办法为以下等式的p1、p2、p3和p4分配一个随机值 p1 y1+p2 y2+p3 y3=p4 假设y1、y2和y3是要求解的变量。如果需要用中替换的值求解,一种可能的方法是: f[y1_, y2_, y3_] := p1 y1 + p2 y2 + p3 y3 - p4 g = f[y1, y2, y3] /. p1 -> RandomReal[] /. p2 -> RandomReal[] /. p3 -> RandomReal[] /. p4 -> Ra

有没有办法为以下等式的p1、p2、p3和p4分配一个随机值

p1 y1+p2 y2+p3 y3=p4


假设y1、y2和y3是要求解的变量。

如果需要用中替换的值求解,一种可能的方法是:

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}]
最简单的(?)方法是
线程
替换规则上的随机值列表:

例如:

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 *)
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]}
或者,受Leonid的启发,您可以使用
备选方案
和模式匹配:

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]

如果您希望它不仅仅匹配
p0,p1,…,p9
,还可以将
DigitCharacter
替换为
NumberString
。当然,对于大型表达式,上面的方法不会特别有效……

其他答案都很好,但是如果你做了很多类似的事情,我建议你用更系统的方式命名变量和系数。这不仅可以让您编写一个简单得多的规则,还可以在从3个方程到4个方程时进行简单得多的更改。例如:

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 *)
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
如果您愿意,也可以将末尾的规则编写为RandomReal[]
。你也不需要输入太多来解决它

In[5]:= Reduce[sub]
Out[5]= y[1] == 3.25099 - 0.31672 y[2] - 0.305785 y[3]
如上所述,您可以使用
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]

如果您可以不使用符号系数名称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

另一种方式:

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]]

系数是否需要有一个特定的分布?正常吗?制服?不,只是随机的真的还是随机的integers@penny:这可能意味着您需要一个均匀的分布……reduce函数的作用是什么?有必要吗?Reduce类似于Solve,但会找到所有的解决方案。在这种情况下,solve应该是sufficient@Andrew +1. 您的解决方案可以稍微简化:
f[y1,y2,y3]/。p1 | p2 | p3 | p4:>RandomReal[]
。哦,事实上,我还不想解决这个问题。我只需要把方程解出来。@Leonid-谢谢你的简化,新的东西要尝试一下!:)+1.如果像我建议的那样使用
备选方案
,你应该使用延迟规则,否则所有的数字都是一样的。@Leonid:oops。。。我想是的!