diff --git a/src/main.rs b/src/main.rs index 64abc33..7f8fe9c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -146,10 +146,16 @@ impl Derive for Op { ), Self::Add(a, b) => Op::Add(a.derive(), b.derive()), Self::Sub(a, b) => Op::Sub(a.derive(), b.derive()), - Self::Pow(a, b) => Op::Pow( - Op::Mul(a.clone(), b.clone()).into(), - Op::Sub(b.clone(), Value::Const(1.0)).into(), - ), + Self::Pow(a, b) => match b { + Value::Eval(e) => Op::Mul( + unimplemented!("Ln(x)"), + Op::Pow(a.clone(), b.clone()).into(), + ), + b => Op::Pow( + Op::Mul(a.clone(), b.clone()).into(), + Op::Sub(b.clone(), Value::Const(1.0)).into(), + ), + }, } .into() } @@ -206,6 +212,11 @@ fn main() { Value::Const(9.0), ) .into(); - let res = n_root(9.0, 2.0); + fn pow_to_x(b: f64) -> Value { + Op::Pow(Value::Const(b), Var::val("x")).into() + } + let eq: Value = Op::Sub(Op::Add(pow_to_x(4.0), pow_to_x(6.0)).into(), pow_to_x(9.0)).into(); + //let res = n_root(9.0, 2.0); + let res = newton_raphson(&eq, 1.0).last(); println!("1.0 - {}/{} ==> {}", &eq, eq.derive(), res.unwrap()); }