你会如何在C ++ / C中解决x的这个数学方程式

时间:2009-10-16 17:13:22

标签: c++ c math

求解x的等式,(1 + x)^ 4 = 34.5 。我对您使用的数学库感兴趣。

等式是多次简单(1 + x)^ 4 = 34.5

谢谢

9 个答案:

答案 0 :(得分:5)

这取决于你所说的“解决”。

如果你的意思是“找到满足该机器浮点精度极限的方程式的双x值”,那么Luiscencio的方法就可以了。

如果通过求解你的意思是“找到形式'x ='的等式,使得x满足给定的等式”(AKA“代数求解”),那么C和C ++都没有可以提供帮助的库。正如Carl所说,你要么必须手工完成,要么使用 Mathematica 或类似的符号数学包进行操作。

如果您的意思不同于其中任何一种,请再次询问更多细节。

答案 1 :(得分:5)

近似x *(x + a)^ b = c

对于更复杂的多项式,您需要更强大的解决方案,但这可能足以完成您的作业。

此算法使用Newton's Method并使用Ruby编写。您可以使用wolfram|alpha验证派生和答案是否正确。

def f(x,a,b,c)
 return x*(x+a)**b-c
end

def df(x,a,b,c)
 return (x+a)**b+b*x*(x+a)**(b-1)
end

def newton(a,b,c)
 xn=0   #initial seed for Newton's method

 while true
  xn2=xn-f(xn,a,b,c)/df(xn,a,b,c)  #Newton's method
  print "f(%.5f)=%.5f\n"%[xn,f(xn,a,b,c)]  
  break if (xn2*10000).to_i==(xn*10000).to_i #set desired precision here
  xn=xn2
 end
 print "root is %.5f"%[xn2]
end

newton(1,4,34.5)

这会产生:

f(0.00000)=-34.50000
f(34.50000)=54793902.65625
f(27.44093)=17954483.09402
f(21.79391)=5883122.74717
f(17.27661)=1927672.51373
f(13.66318)=631598.66717
f(10.77301)=206926.07160
f(8.46171)=67782.26596
f(6.61400)=22194.34671
f(5.13819)=7259.61867
f(3.96214)=2367.67791
f(3.03097)=765.73665
f(2.30728)=241.54928
f(1.77466)=70.68568
f(1.43951)=16.48341
f(1.30101)=1.97186
f(1.27945)=0.04145
f(1.27897)=0.00002
root is 1.27897

答案 2 :(得分:4)

我假设这个问题已经有了很大的改变,因为其他人的回答,因为解决方案是一个微不足道的重新排列等式:

x = 34.5 ^(1/4) - 1

代码:

double x = pow( 34.5, 1.0/4.0 ) - 1 ;

答案 3 :(得分:3)

你的意思是数字解决? 我会将C运行时与“math.h”一起使用,因为Newton–Raphson很容易实现。实际上,您应该说明要求,例如可接受的误差幅度,性能等......然后缩小库选择范围。

答案 4 :(得分:2)

在C语言中解决类似的问题并不会与手工解决它有太大的不同;使用更适合做符号数学的系统(Mathematica?)可能更容易。最近询问了similar question

答案 5 :(得分:2)

正如其他人所说,你的问题不太清楚。有两种方法可以通过编程方式求解方程式:

  1. 数字或
  2. 符号。
  3. 第一类方法是numerical analysis的主题。

    为称为Computer Algebra Systems(CAS)的软件开发了第二类方法。为此目的,至少有一个C ++库,GiNaC

    此外,作为Carl Norum mentioned,最近询问了similar question,其他CAS库在答案中被引用。

答案 6 :(得分:1)

这是为了更简单的功能。它也有多个种子,以确保我们找到所有的根。

# solve (x+a)^b=c
def f(x,a,b,c)
  return (x+a)**b-c
end

def df(x,a,b,c)
  return b*(x+a)**(b-1)
end

def newton(a,b,c)
  roots=[]
  for seed in [-100000, -100, -1,1,100, 100000] # set initial guesses here
    print "\n    with seed %d\n"%[seed]
    root=newton_root(seed,a,b,c)
    if root and not roots.include?(root)
      roots << root
    end
  end
  return roots
end

def newton_root(xn,a,b,c)
  while true
    if (df(xn,a,b,c)).abs<0.000001  # give up with this seed if derivative is too low
      print "    gave up on this seed\n"
      return nil
    end

    xn2=xn-f(xn,a,b,c)/df(xn,a,b,c)     
    #  print "    f(%.5f)=%.5f\n"%[xn,f(xn,a,b,c), xn2]     

    if (xn2*10000).to_i==(xn*10000).to_i # set precision here
      rounded_xn=(xn2*10000).to_i/10000.0
      print "        found root %0.5f\n"%[rounded_xn]
      return rounded_xn
    else
      xn=xn2
    end
  end
end


print newton(1,4,34.5).inspect

这会产生:

with seed -100000
    found root -3.42350

with seed -100
    found root -3.42350

with seed -1
gave up on this seed

with seed 1
    found root 1.42350

with seed 100
    found root 1.42350

with seed 100000
    found root 1.42350

[ - 3.4235,1.4235]

答案 7 :(得分:1)

x1 = 34.5 ^(1/4) - 1
x2 = -34.5 ^(1/4) - 1

// #include&lt; math.h&gt;
double x1 = sqrt(sqrt(34.5)) - 1;
double x2 = -sqrt(sqrt(34.5)) - 1;

答案 8 :(得分:1)

  

(1 + x)^ 4 = 34.5

     

(1 + x)^ 2 = sqrt(34.5)= +/- 5.87367

     

1 + x = sqrt(sqrt(34.5))= +/- 2.42357

     

x = 1.423557 x = -3.42357

验证

  

(1 + 1.423557)^ 4 = 34.4995(已检查

     

(1 + -3.42357)^ 4 = 34.500(已检查