C语言实现空间任意一点电势与电场的求解

学校要求写一份C语言的大作业

一个人写了嘿嘿

各位大佬看到有啥不足的敬请指出哈

开辟了一个10*10*10 的空间,可以在里面构造均匀带电的球,椭球,长方体,圆环,还有点电荷,支持依次构造多个空间立体,然后求空间某点的电场强度与电势

其实大部分内容比较简单吧,先是求出点电荷在空间任意一点的电场与电势

这是求解电势的,电场的也差不多,就是要设置一个条件来排除那些由于模型构造问题和计算机加0.1的时候其实会加0.99999999989这种问题产生的极大值

然后用0.1的步长去遍历空间中的每个点,设置条件来查看这个点是否在你设置的空间图形中,就是把均匀带电的球体、椭球体分解成了很多很多的点电荷然后分别求电场与电势并且叠加

这就是把空间球体拆成了很多的点电荷。

最后就是写空间球体,椭球,长方体他们各自的电场,电势啦

 大体上还是比较简单的,话不多说,下面就是我的整体代码了,希望大家斧正。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include <windows.h>
//暂时先用一个结构体来表示空间任意一点的坐标
typedef struct place {
    double x;
    double y;
    double z;
}Place;
//用一个结构体表示矢量
typedef struct vector {
    double x;
    double y;
    double z;
}Vector;
//用一个结构体表示点电荷,其中包含点电荷的位置和点电荷的电量大小
typedef struct ddh {
    double quantity;
    double x;
    double y;
    double z;
}Point;
//用一个结构体表示圆
//由于要遍历整个球形中所有的点,所以规定其半径不能大于2
typedef struct circle {
    double xx;
    double xy;
    double xz;
    double r;
}Circle;

//创建一个函数pointQuantity用于求点电荷的电势
double pointPotantial(Point a, Place b) {
    double dx = a.x - b.x;
    double dy = a.y - b.y;
    double dz = a.z - b.z;
    dx = dx*dx;
    dy = dy*dy;
    dz = dz*dz;
    if (dx<0.00001&&dx>-0.000001)dx = 0;//加一个限制条件使得求球体内部的电场强度和电势的时候排除r趋近于0的情况
    if (dy<0.00001&&dy>-0.000001)dy = 0;
    if (dz<0.00001&&dz>-0.000001)dz = 0;
    double d = dx + dy + dz;
    double e = sqrt(((a.quantity)*(a.quantity)) / d);
    return e;
}
//创建一个函数pointChang用于求点电荷产生的电场
Vector pointChang(Point a, Place b) {
    double dx = b.x - a.x;
    double dy = b.y - a.y;
    double dz = b.z - a.z;
    double dx_ = dx*dx;
    double dy_ = dy*dy;
    double dz_ = dz*dz;
    if (dx<0.00001&&dx>-0.000001)dx = 0;//加一个限制条件使得求球体内部的电场强度和电势的时候排除r趋近于0的情况
    if (dy<0.00001&&dy>-0.000001)dy = 0;
    if (dz<0.00001&&dz>-0.000001)dz = 0;
    double d = dx_ + dy_ + dz_;
    double e = (a.quantity) / d;
    Vector E;
    E.x = e*(dx / sqrt(d));
    E.y = e*(dy / sqrt(d));
    E.z = e*(dz / sqrt(d));
    return E;
}
//创建一个函数实现求出整个空间的电势能
//double electricityPower(){
//    ;
//}
//创建一个函数实现将电量均匀散布在球中
Point *sanbucircle(Circle a, double quantityl) {
    double X[10000];
    double Y[10000];
    double Z[10000];
    double x, y, z;
    int k = 0;
    double    m, b, c;//a,b,c分别表示点x,y,z到球心的距离
                    //遍历空间中所有的点,找出球中的点,并将这些点的坐标存在三个数组中,三个数组分别存储他们的x,y,z坐标
                    //将整个球形空间转化成为一个个的点,最后返回这些点
    for (x = 0; x < 20; x = x + 0.1) {
        for (y = 0; y < 20; y = y + 0.1) {
            for (z = 0; z < 20; z = z + 0.1) {
                m = x - a.xx;
                b = y - a.xy;
                c = z - a.xz;
                if ((m*m + b*b + c*c) < (a.r)*(a.r)) {
                    X[k] = x;
                    Y[k] = y;
                    Z[k] = z;
                    k++;
                }
            }
        }
    }
    //将电荷均匀分布
    double lquantity = quantityl / k;
    int K = k;
    Point circlePoint[20000];
    int u;
    for (u = 0; u < 20000; u++) {
        circlePoint[u].quantity = 0;
    }
    for (k = 0; k < K; k++) {
        circlePoint[k].x = X[k];
        circlePoint[k].y = Y[k];
        circlePoint[k].z = Z[k];
        circlePoint[k].quantity = lquantity;
    }
    return circlePoint;
}
//创建一个结构体用于存储椭球
typedef struct tcircle {
    double a;//椭球x轴上距离球心最远距离
    double b;//椭球y轴上距离球心最远距离

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值